关于容器:Docker-入门二三种进入-Docker-容器的方法

4次阅读

共计 1431 个字符,预计需要花费 4 分钟才能阅读完成。

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 的连贯形式,抉择哪个还是要看应用场景。

正文完
 0