Docker - 容器和壳

默认情况下,当您启动容器时,您还将在启动容器时使用 shell命令,如下所示.这是我们在前面的章节中看到的,当我们使用容器时.

Shell Command

在上面的截图中,您可以观察到我们发出了以下命令 :

 
 sudo docker run -it centos/bin/bash


我们使用此命令创建一个新容器,然后使用Ctrl + P + Q命令退出容器.它确保即使在我们从容器中退出之后容器仍然存在.

我们可以使用Docker ps 命令验证容器是否仍然存在.如果我们不得不直接退出容器,那么容器本身就会被破坏.

现在有一种更简单的方法可以连接到容器并干净地退出它们而不需要销毁它们.实现此目的的一种方法是使用 nsenter 命令.

在运行 nsenter 命令之前,您需要先安装 nsenter 镜像.可以使用以下命令 :

 
 docker run --rm -v/usr/local/bin:/target jpetazzo/nsenter



Nsenter Image

在我们使用 nsenter 命令之前,我们需要获取容器的进程ID,因为这是 nsenter 命令所必需的.我们可以通过Docker 检查命令获取进程ID,并通过 Pid 过滤它.

Inspect Command

如上面的截图所示,我们首先使用 docker ps 命令查看正在运行的容器.我们可以看到有一个运行容器,其ID为ef42a4c5e663.

然后我们使用Docker inspect 命令检查此容器的配置然后使用 grep 命令只是过滤进程ID.从输出中,我们可以看到进程ID是2978.

现在我们有了进程ID,我们可以继续前进并使用 nsenter 命令附加到Docker容器.

nsenter

此方法允许在不退出容器的情况下附加到容器.

语法

nsenter -m -u -n -p -i -t containerID命令

选项

  • -u 用于提及 Uts名称空间

  • -m 用于提及 mount命名空间

  • -n 用于提及网络命名空间

  • -p 用于提及进程命名空间

  • -i 以使容器运行交互模式.

  • -t 用于将容器的I/O流连接到主机操作系统.

  • containerID : 这是容器的ID.

  • Command : 这是在容器中运行的命令.

返回值

示例

 
 sudo nsenter -m -u -n -p -i -t 2978 /bin/bash


输出

Nsenter

从输出中,我们可以观察以下几点;

  • 提示更改为当我们发出 nsenter 命令时,直接 bash shell .

  • 然后我们发出退出命令.现在通常如果你没有使用 nsenter 命令,容器将被销毁.但是你会注意到,当我们运行 nsenter 命令时,容器仍然正常运行.