Docker attach 与 exec:命令差异大揭秘

2024-12-04

一、引言

图片14.jpg

Docker 作为容器化技术的代表,其命令众多且功能各异。其中,docker attach 和 docker exec 这两个命令常常让使用者感到困惑。本文将详细解析它们之间的区别,帮助大家更好地理解和运用这两个命令。刚开始接触 Docker 的时候,很多命令让人傻傻分不清楚,其中就有 docker attach 和 docker exec。稍微了解容器使用的同学就会知道进入容器有两种方式,分别是 docker attach 和 docker exec。下面我们就来具体看看它们的区别。

Docker attach

Docker attach 是 Docker CLI 的一个子命令,用于将当前的控制台连接到正在运行的容器中,允许我们在容器中执行命令、查看输出等。

Docker exec

Docker exec 也是 Docker CLI 的一个子命令,用于在运行的 Docker 容器中执行命令。Docker exec 将在该容器中启动一个新的进程,并执行指定的命令。这意味着我们可以在不打断容器的情况下执行命令。

区别

attach 和 Docker exec 主要的区别在于它们启动的进程和它们的行为方式。Docker attach 在容器的当前进程上直接启动一个终端,并将该终端连接到容器的标准输入、标准输出和标准错误。这意味着我们只能在容器当前运行的进程中操作,而且如果我们退出该终端,容器也会被终止。Docker exec 在容器内启动一个新的进程,该进程可以在后台运行,不影响其他进程。这意味着我们可以在不打断容器正在运行的其他进程的情况下执行命令。从命令的使用方式来看,Docker attach 通常用于调试容器内部的应用程序,并且在操作需要交互式输入和输出时很有用。Docker exec 则通常用于在容器中执行命令,并且在需要在容器内部执行复杂操作时非常方便。综上所述,可以得出如下结论:docker attach 进入容器,再退出会导致容器停止;docker exec 进入容器,再退出不会导致容器停止。因此,我们推荐使用后者。

二、docker attach

1. 进入容器的方式

使用命令docker attach builder可以进入名为builder的容器。进入容器后,可以使用ls命令查看容器内目录。

2. 退出后的影响

当从容器中退出后,使用docker ps | grep builder查看,会发现容器停止运行。这是因为docker attach直接进入容器启动命令的终端,不会启动新的进程,退出时会导致容器停止。

三、docker exec

1. 进入容器的方式

命令为docker exec -it builder bash。这一命令可以在运行的容器builder中启动一个新的交互式终端会话,使用户能够在容器内执行命令。

2. 退出后的影响

退出后,使用docker ps | grep builder查看,容器仍在运行。这是因为docker exec在容器内启动一个新的进程,而不是直接连接到容器的当前进程。当用户退出时,只是关闭了这个新启动的进程,不会影响容器的整体运行状态。例如,我们可以使用以下步骤验证:首先创建一个容器,如docker run -it --name builder ubuntu /bin/bash,然后使用docker exec -it builder bash进入容器,执行一些命令,如ls查看目录结构。接着退出容器,再使用docker ps | grep builder查看,会发现容器依然在运行。这与docker attach有很大的不同,docker attach在退出时会导致容器停止运行。

四、结论

综上所述,docker attach 进入容器再退出会导致容器停止,而 docker exec 进入容器再退出不会导致容器停止。因此,在实际使用中,推荐使用 docker exec 命令。这是因为 docker attach 在容器的当前进程上直接启动一个终端,并将该终端连接到容器的标准输入、标准输出和标准错误,我们只能在容器当前运行的进程中操作,退出时会导致容器终止。而 docker exec 在容器内启动一个新的进程,该进程可以在后台运行,不影响其他进程,我们可以在不打断容器正在运行的其他进程的情况下执行命令。从命令的使用方式来看,Docker attach 通常用于调试容器内部的应用程序,并且在操作需要交互式输入和输出时很有用;Docker exec 则通常用于在容器中执行命令,并且在需要在容器内部执行复杂操作时非常方便。