在我們對Docker容器操作的時候,有時候會誤操作或者其他的原因無意間退出了正在操作的容器,也許你會擔憂你在其中的一些操作未保存下來,無須擔憂,本文中將會提供各種方法供你參考(我的建議使用最后一種)。在本文,我們將討論五種(4+1)連接Docker容器并與其進行交互的方法。例子中所有的代碼都可以在GitHub中找到,你可以親自對它們進行測試。
1.nsenter
安裝
nsenter 工具在 util-Linux 包2.23版本后包含。 如果系統中 util-linux 包沒有該命令,可以按照下面的方法從源碼安裝。
你也可以點擊此鏈接進行下載 http://pan.baidu.com/s/1FEt8y
$ 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-ncurses
$ make nsenter && sudo cp nsenter /usr/local/bin使用
nsenter 可以訪問另一個進程的名字空間。nsenter 要正常工作需要有 root 權限。 很不幸,Ubuntu 14.4 仍然使用的是 util-linux 2.20。安裝最新版本的 util-linux(2.24)版,請按照以下步驟:
$ wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz; tar xzvf util-linux-2.24.tar.gz $ cd util-linux-2.24 $ ./configure --without-ncurses && make nsenter $ sudo cp nsenter /usr/local/bin
從util-linux版本2.23開始,nsenter工具就包含在其中。它用來訪問另一個進程的名字空間。nsenter要正常工作需要有root權限。很不幸,Ubuntu 14.4仍然使用的是util-linux版本2.20。安裝最新版本的util-linux(2.24)版,請按照以下步驟:
cd /tmp
為了連接到容器,你還需要找到容器的第一個進程的PID,通過這個PID,你就可以連接到這個容器:
$ docker inspect --format "{{ .State.Pid }}" <container-id> //or run 'docker inspect -f "{{ .State.Pid }}" <container-id>' $ nsenter --target $PID --mount --uts --ipc --net --pid 2.nsinit
從0.9版本開始,Docker自身就具有一個管理容器的庫,名字為 libcontainer。libcontainer中的nsinit工具允許用戶直接訪問linux名字空間和cgroup內核。在安裝nsinit之前,你首先需要安裝Go運行時環境:
$ apt-get installgit 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:
$ apt-get installgit 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讀取的是位于/var/lib/docer/execdriver/native/<Container-id>容器目錄下的配置數據。要運行nsinit,你需要切換到容器目錄下。由于/var/lib/docker目錄對于root用戶是只讀權限,因此你還需要root權限。通過docker的ps命令,你可以確定容器ID。一旦你進入/var/lib/docker目錄,你就可以連接容器了:
nsinit exec /bin/bash
3.lxc(-attach)
直到Docker 0.8.1版本為止,LXC一直是管理容器的基本工具,Docker一直支持這個工具。但是從0.9.0版本開始,Docker默認使用libcontainer管理容器,不再依賴LXC了。因此默認情況下,你不能使用lxc-attach了。
新聞熱點
疑難解答