分布式進階(七)Ubuntu下如何進入 Docker 容器

      網友投稿 2208 2025-03-31

      如何進入?Docker?容器

      英文原文:How?to?enter?a?Docker?container

      在這篇文章里,我將討論四種連接Docker容器并與其進行交互的方法。例子中所有的代碼都可以在GitHub中找到,你可以親自對它們進行測試。

      nsenter

      從util-linux版本2.23開始,nsenter工具就包含在其中。它用來訪問另一個進程的名字空間。nsenter要正常工作需要有root權限。很不幸,Ubuntu?14.4仍然使用的是util-linux版本2.20。安裝最新版本的util-linux(2.24)版,請按照以下步驟:

      cd?/tmp

      curl?https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz?|?tar?-zxf-cd?util-linux-2.24./configure?--without-ncursesmake?nsentercp?nsenter?/usr/local/bin

      為了連接到容器,你還需要找到容器的第一個進程的PID。

      docker?inspect?--format?"{{?.State.Pid?}}"?

      通過這個PID,你就可以連接到這個容器:

      nsenter?--target?$PID?--mount?--uts?--ipc?--net?--pid

      nsinit

      從0.9版本開始,Docker自身就具有一個管理容器的庫,名字為?libcontainer。libcontainer中的nsinit工具允許用戶直接訪問linux名字空間和cgroup內核。在安裝nsinit之前,你首先需要安裝Go運行時環境:

      apt-get?install?git?golang-go

      mkdir?-p?$HOME/go-dev/binmkdir?-p?$HOME/go-dev/src

      echo?"export?GOPATH=$HOME/go-dev"?>>?~/.profileecho?"PATH=$PATH:$GOPATH/bin"?>>?~/.profile

      source?~/.profile

      接下來才安裝nsinit:

      mkdir?-p?$GOPATH/src/github.com/dotcloudcd?$GOPATH/src/github.com/dotcloud

      git?clone?https://github.com/dotcloud/docker.gitcd?$GOPATH/src/github.com/dotcloud/docker

      分布式進階(七)Ubuntu下如何進入 Docker 容器

      /usr/bin/go?get?-v?github.com/dotcloud/docker/vendor/src/github.com/docker/libcontainer/nsinit

      nsinit讀取的是位于/var/lib/docer/execdriver/native/容器目錄下的配置數據。要運行nsinit,你需要切換到容器目錄下。由于/var/lib/docker目錄對于root用戶是只讀權限,因此你還需要root權限。通過docker的ps命令,你可以確定容器ID。一旦你進入/var/lib/docker目錄,你就可以連接容器了:

      nsinit?exec?/bin/bash

      lxc(-attach)

      直到Docker?0.8.1版本為止,LXC一直是管理容器的基本工具,Docker一直支持這個工具。但是從0.9.0版本開始,Docker默認使用libcontainer管理容器,不再依賴LXC了。因此默認情況下,你不能使用lxc-attach了。

      如果你仍然希望使用lxc-attach,那么你需要使用-e?lxc選項來重新啟動Docker服務進程。使用這個選項,Docker的內部將再次使用LXC管理容器了。完成這個任務最簡單的做法就是創建/etc/default/docker文件(如果這個文件仍然不存在),并添加以下內容:

      DOCKER_OPTS="?-e?lxc"

      現在你可以重新啟動Docker服務了。要連接容器,你需要知道完整的容器ID:

      docker?ps?--no-trunc

      接下來,你就可以連接這個容器了。要完成下面工作,你還需要root權限:

      lxc-attach?-n??--?/bin/bash

      sshd

      上面所有三種方法都要求具有主機系統的root權限。為了不采用root權限,通過ssh訪問容器將是一個很好的選擇。

      要做到這一點,你需要構建一個支持SSH服務的基礎映像。此時,我們可能遇到這樣的問題:我們是不是用Docker?CMD或者ENTRYPOINT運行一條命令就可以了?如果此時有sshd進程運行,那么我們就不要再運行其他進程了。接下來的工作是創建一個腳本或者使用像supervisord這樣的進程管理工具來啟動其它所有需要啟動的進程。有關如何使用supervisord的?優秀的文檔可以在Docker的web站點上找到。一旦你啟動了具有sshd進程的容器,你就可以像以往一樣通過ssh客戶端了連接這個容器了。

      結論

      sshd方法可能是最簡單的連接容器的方法,而且大多數用戶習慣通過ssh連接虛擬機。另外,連接容器時你也不需要一定使用root權限。不過,對于是否一個容器是否應當管理不止一個進程仍然存在許多爭議。這種方法最終使得每個容器了多了一個sshd進程,這從根本上來說不是進程虛擬化的所提倡的。

      另外三種方法都需要root權限。到0.8.1版本為止,Docker都是使用LXC來管理容器的。正是由于這個原因,使用lxc-attach連接容器就非常容易。不過從版本0.9.0開始Docker服務就必須使用?-e?lxc選項啟動才能在內部支持LXC管理容器。不過,由于設置了這個選項,Docker將再次依賴LXC,而LXC可能隨著發布或者安裝的不同可能被剔除。

      nsenter和nsinit總的來說是相同的。這兩個工具的主要區別是nsinit在本身的容器了建立了一個新的進程,而nsenter只是訪問了名字空間。Jerome?Petazzoni在Docker博客文章里對這一點說的很透徹。

      Docker Ubuntu 分布式 容器

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:業績不好如何做好一份年終總結?
      下一篇:安全掛鎖設計的目地以及安全系數的介紹
      相關文章
      亚洲 欧洲 自拍 另类 校园| 亚洲狠狠ady亚洲精品大秀| 亚洲人妻av伦理| 亚洲视频精品在线观看| yy6080亚洲一级理论| 亚洲欧洲日韩不卡| 国产亚洲视频在线| 亚洲精品自在线拍| 在线亚洲午夜理论AV大片| 国产人成亚洲第一网站在线播放| 久久亚洲国产午夜精品理论片| 亚洲国产欧美国产综合一区| 久久久久亚洲AV无码永不| 国产成人毛片亚洲精品| 亚洲日本天堂在线| 亚洲视频手机在线| 亚洲中文字幕无码日韩| 亚洲Av永久无码精品一区二区| 久久久久亚洲精品日久生情| 久久亚洲欧洲国产综合| 亚洲国产午夜精品理论片在线播放| 亚洲蜜芽在线精品一区| 亚洲精品国偷自产在线| 男人的天堂av亚洲一区2区| 亚洲国产综合人成综合网站00| 黑人大战亚洲人精品一区| 亚洲av无码一区二区三区天堂| 亚洲天堂一区在线| 亚洲AV第一页国产精品| 中文字幕亚洲专区| 男人的天堂亚洲一区二区三区| 在线aⅴ亚洲中文字幕| 亚洲网址在线观看| 亚洲精品国产品国语在线| 亚洲 另类 无码 在线| 亚洲熟女乱色一区二区三区| 亚洲黄色免费网站| 亚洲AV无码成人精品区蜜桃 | WWW亚洲色大成网络.COM| 亚洲成人黄色在线| 亚洲一区二区电影|