1. 使用 attach 命令连接容器
docker attach [容器名] 或者 [容器ID]
attach 命令有如下缺点:
1.1 当你从多个终端同时使用 attach 命令连接到同一个容器后,多个终端显示的操作是同步的。也就是说你从A终端操作什么命令,在B终端也显示一样的命令和结果。同理,你在某个终端针对该容器的某个操作阻塞了或者异常了,那么其他的终端也同样不可操作了。
1.2 在 attach 的连接方式下使用 exit 退出容器后,该容器也会终止运行。
2. 使用 nsenter 命令连接容器
使用该命令连接容器,用 exit 命令退出容器后,容器不会终止运行。
2.1 nsenter 命令包含在 util-linux 里面,所以使用之前要先安装。
yum install -y util-linux
2.2 使用 nsenter 命令连接容器,需要获取容器的 PID。
可以使用 inspect 命令获取容器的详情:
docker inspect [容器名]或者[容器ID]
获取 docker 的第一个进程的 PID:
docker inspect --format "{{.State.Pid}}" mycentos
通过该 PID 连接容器:
nsenter --target [容器第一个进程的PID] --mount --uts --ipc --net --pid
写一个连接容器的脚本,命名为 docker_login.sh,脚本内容如下:
#!/bin/bash
#此脚本用来登录任意容器。使用方法:./docker_login [容器名]或者[容器ID]
docker_in(){
NAME_ID=$1
PID=$(docker inspect --format "{{.State.Pid}}" $NAME_ID)
#nsenter --target $PID --mount --uts --ipc --net --pid
nsenter --target $PID --mount --uts --ipc --net --pid /bin/bash
#nsenter --target $PID --mount --uts --ipc --net --pid /bin/bash 2>/dev/null
#nsenter --target $PID --mount --uts --ipc --net --pid /bin/bash >/dev/null 2>&1
#nsenter --target $PID --mount --uts --ipc --net --pid /bin/bash >/dev/null 2>&1 &
if (test $? -ne 0)
then
nsenter --target $PID --mount --uts --ipc --net --pid /bin/sh
fi
}
docker_in $1
3. 使用 exec 命令连接容器
docker exec -it [容器名] /bin/bash
使用该命令连接容器,exit 退出后容器仍然继续运行。
说明:
为什么使用 exec 和 nsenter 命令连接容器再退出就不会导致容器终止,而使用 attach 连接容器再退出,容器就终止运行了呢?
因为前两个命令都是另外启动一个新的 bash 来连接容器,当退出容器时,终止的只是它们建立的 bash,而容器原来的 bash 进程还在。相应的,attach 使用的是容器启动后的 bash,所以退出该 bash ,容器也就终止了。
总结:
脚本的方式适合单节点上的容器维护,缺点是每台主机上都放个脚本,增加维护成本。最简单最常用的方式其实是 exec ,一个命令,语法也很简单。三种 docker 的连接方式,选择哪个还是要看使用场景。