Docker 入门(二)三种进入 Docker 容器的方法

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 的连接方式,选择哪个还是要看使用场景。

你可能感兴趣的:(Docker 入门(二)三种进入 Docker 容器的方法)