1. 程式人生 > >怎樣連線到docker容器內部

怎樣連線到docker容器內部

當我們執行好docker容器之後常常需要進入docker容器內部進行一些操作:
1.docker本身提供了attach命令可以實現這一需求:

$ docker attach [容器名]

attach連線docker後,退出docker容器有兩種方式:
1.1 按CTRL + D或者輸入exit命令退出,這種方式會引起容器停止執行
1.2 先按CTRL +P 再按CTRL + Q退出,這種方式理論上不會引起容器停止執行,實際上還是偶爾引起容器停止執行,出現奇奇怪怪的問題。
所以,我打算介紹一種比較穩妥的方式。

2.利用util-linux包的nsenter命令連線docker容器
2.1 安裝util-linux步驟

$ wget https://www.kernel.org/pub/linux/utils/util-linux/v2.29/util-linux-2.29.1.tar.gz -c /usr/local/src
$ tar xvf util-linux-2.29.1.tar.gz
$ ./configure –without-ncurses
$ make #注意不要make install
$ cp nsenter /usr/local/bin/

2.2 編寫連線指令碼:connect.sh

#!/bin/sh
CONTAINER_NAME=$1
if [ ! -n "$CONTAINER_NAME" ];then
echo "請輸入即將要登入的容器名稱,例如要登入容器xiaoniuapp-api,請輸入:./connect.sh xiaoniuapp-api" else CONTAINER_ID=`docker ps -a | grep $CONTAINER_NAME -w | awk '{print $1}'` echo "容器ID:"$CONTAINER_ID CONTAINER_PID=`docker inspect --format "{{ .State.Pid }}" $CONTAINER_ID` echo "容器PID:"$CONTAINER_PID echo
"開始連線容器。。。" nsenter --target $CONTAINER_PID --mount --uts --ipc --net --pid fi

2.3 使用指令碼

$ chmod u+x connect.sh
$ ./connect.sh [容器名]
示例如下:
[root@Dockerdeploy-app ~]# docker run -i -t --name mynginx nginx /bin/bash
root@063e449682f7:/##先按CTRL +P 再按CTRL + Q退出
[root@Dockerdeploy-app ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
063e449682f7        nginx               "/bin/bash"         10 seconds ago      Up 9 seconds        80/tcp, 443/tcp     mynginx
[root@Dockerdeploy-app ~]# ./connect.sh mynginx
容器ID063e449682f7
容器PID1491
開始連線容器。。。
root@063e449682f7:/#