简介
在本实验中,你将学习如何使用 docker container attach
命令与运行中的容器进行交互。你将通过分离模式(detached mode)启动容器,附加到容器以观察其输出,并使用默认按键组合来分离连接。
你还将探索如何附加到启用了 TTY 的容器,并学习如何覆盖默认的分离按键序列,从而在与 Docker 容器交互时获得更大的灵活性。
在本实验中,你将学习如何使用 docker container attach
命令与运行中的容器进行交互。你将通过分离模式(detached mode)启动容器,附加到容器以观察其输出,并使用默认按键组合来分离连接。
你还将探索如何附加到启用了 TTY 的容器,并学习如何覆盖默认的分离按键序列,从而在与 Docker 容器交互时获得更大的灵活性。
在这一步骤中,你将学习如何以分离模式(detached mode)启动 Docker 容器。当容器以分离模式运行时,它会在后台运行,且 Docker CLI 不会附加到容器的标准输入、输出或错误流。这种方式非常适合运行长期服务或应用程序。
我们将使用 ubuntu
镜像来运行一个简单的命令,该命令会打印一条消息然后退出。首先,让我们拉取 ubuntu
镜像以确保它在本地可用。
docker pull ubuntu
现在,让我们使用带有 -d
标志的 docker run
命令以分离模式运行容器。我们将运行一个简单的 echo
命令,打印「Hello from detached container!」然后退出。
docker run -d ubuntu echo "Hello from detached container!"
运行该命令后,Docker 会打印容器 ID。这表明容器已以分离模式启动。你可以使用 docker ps -a
命令验证容器是否正在运行(或已完成其任务),该命令会显示所有容器,包括已退出的容器。
docker ps -a
你应该能看到刚刚启动的容器的条目。STATUS
列会显示容器是否仍在运行或已退出。由于我们的命令非常简短,当你运行 docker ps -a
时,容器很可能已经退出。
在上一步骤中,我们以分离模式启动了一个容器。虽然该容器运行了一个简单的命令并可能快速退出,但我们仍然可以附加到它来查看其输出。docker attach
命令允许你连接到正在运行或已退出容器的标准输入、输出和错误流。
首先,让我们获取上一步启动的容器 ID。你可以使用 docker ps -a
命令查找运行 echo
命令的容器,并复制容器 ID。
docker ps -a
现在,使用 docker attach
命令后跟容器 ID 来附加到容器。
docker attach <container_id>
将 <container_id>
替换为你容器的实际 ID。由于容器运行的是简单的 echo
命令且已退出,你可能不会立即看到任何输出,或者如果输出仍在缓冲中,可能会看到「Hello from detached container!」的输出。attach
命令会将你连接到容器的流。由于容器已完成其任务,attach
命令很可能在连接后立即退出。
为了演示如何附加到持续运行的容器,让我们启动一个新的分离式容器,运行一个使其保持活动状态几秒钟的命令。我们将再次使用 ubuntu
镜像并运行 sleep 10
。
docker run -d ubuntu sleep 10
使用 docker ps
获取这个新容器的 ID。这次,容器应该处于 Up
状态。
docker ps
现在,使用其 ID 附加到这个正在运行的容器。
docker attach <new_container_id>
将 <new_container_id>
替换为运行 sleep 10
的容器 ID。你将附加到容器的标准流。由于 sleep
命令不会产生输出,你不会看到任何内容。终端会显示为等待状态。容器将运行 10 秒后退出。当容器退出时,attach
命令也会退出,将你返回到终端提示符。
在上一步骤中,你已附加到一个运行中的容器。当你附加到容器时,实际上是连接到了它的标准输入、输出和错误流。若要从容器分离而不停止它,可以使用特定的按键组合。默认情况下,这个组合是 CTRL+p
紧接着 CTRL+q
。
让我们启动一个新的分离式容器,让它运行较长时间以便你有足够时间练习分离操作。我们将使用 ubuntu
镜像并运行 sleep 60
。
docker run -d ubuntu sleep 60
使用 docker ps
获取这个新容器的 ID。
docker ps
现在,使用容器 ID 附加到这个运行中的容器。
docker attach <container_id>
将 <container_id>
替换为运行 sleep 60
的容器 ID。你现在已附加到容器。若要分离容器并返回终端提示符而不停止容器,请按以下按键组合:
CTRL
键,然后按下 p
键。释放这两个键。CTRL
键,然后按下 q
键。释放这两个键。按下 CTRL+p
紧接着 CTRL+q
后,你应该会返回到终端提示符。容器将继续在后台运行。你可以使用 docker ps
验证容器是否仍在运行。
docker ps
你应该能看到运行 sleep 60
的容器被列出,状态显示为 Up
。
在本步骤中,我们将启动另一个分离式容器,但这次会为容器启用伪终端(TTY)。当你需要与容器的 shell 交互或运行需要终端的命令时,启用 TTY 通常是必要的。
我们将使用 docker run
命令,其中 -d
参数表示分离模式,-t
参数用于分配伪终端。我们将运行一个保持容器运行的简单命令,例如 sleep 60
。
docker run -d -t ubuntu sleep 60
-t
参数会分配一个伪终端,这是一个虚拟终端,让你能够像连接物理终端一样与容器交互。尽管容器以分离模式(-d
)运行,但启用 TTY 对于交互式进程非常重要,特别是当你计划稍后附加到容器并需要终端环境时。
运行命令后,Docker 会再次打印容器 ID,表示容器已启用 TTY 并以分离模式启动。你可以使用 docker ps
验证容器是否正在运行。
docker ps
你应该能看到新容器被列出,状态显示为 Up
。请记下容器 ID,因为在下一步附加到这个容器时需要用到它。
在上一步骤中,我们启动了一个启用 TTY 的分离式容器。现在,我们将附加到这个容器,并练习使用默认按键组合(CTRL+p
紧接着 CTRL+q
)进行分离。附加到启用 TTY 的容器可以实现交互式会话,即使初始命令并不需要交互。
首先,获取你在上一步中启动的、运行 sleep 60
并启用 TTY 的容器 ID。
docker ps
找到运行 sleep 60
的 ubuntu
容器的 ID。
现在,使用 docker attach
命令附加到这个容器,后面跟上容器 ID。
docker attach <container_id>
将 <container_id>
替换为你容器的实际 ID。你现在已附加到容器的标准流,由于启用了 TTY,你将获得一个类似终端的界面。虽然 sleep
命令不需要交互,但你已连接到容器的虚拟终端。
要从容器分离而不停止它,请使用默认的分离按键组合:
CTRL
键,然后按下 p
键。释放这两个键。CTRL
键,然后按下 q
键。释放这两个键。你应该会返回到终端提示符。容器将继续在后台运行,直到 sleep 60
命令执行完毕。你可以使用 docker ps
验证容器是否仍在运行。
docker ps
你应该能看到运行 sleep 60
的容器被列出,状态显示为 Up
。
在这最后一步中,你将学习如何在附加到容器时覆盖默认的分离按键组合。当默认组合与其他应用程序冲突,或者你偏好使用不同的按键组合时,这个功能会很有用。
我们将使用带有 --detach-keys
标志的 docker attach
命令来指定不同的按键组合。--detach-keys
标志的格式为 sequence
,其中 sequence
是以逗号分隔的按键组合字符串。例如,ctrl-a,ctrl-d
会将分离序列设置为先按 CTRL+a
再按 CTRL+d
。
首先,让我们启动一个新的启用 TTY 的分离式容器,该容器将运行一段时间。
docker run -d -t ubuntu sleep 60
使用 docker ps
获取这个新容器的 ID。
docker ps
现在附加到这个容器,但这次使用 --detach-keys
标志指定不同的分离按键组合。我们将使用 ctrl-a,d
作为新组合,这意味着你需要先按 CTRL+a
再按 d
来分离。
docker attach --detach-keys="ctrl-a,d" <container_id>
将 <container_id>
替换为你容器的实际 ID。你现在已附加到容器。要使用新组合分离:
CTRL
键,然后按下 a
键。释放这两个键。d
键。你应该会返回到终端提示符。容器将继续在后台运行。你可以使用 docker ps
验证容器是否仍在运行。
docker ps
你应该能看到运行 sleep 60
的容器被列出,状态显示为 Up
。
在本实验中,你学习了如何使用 docker run -d
命令以分离模式启动 Docker 容器,这种方式可以让容器在后台运行而无需附加到终端。随后你练习了使用 docker attach
命令连接到正在运行或已退出容器的标准流,以观察其输出。
此外,你还探索了如何使用默认按键组合(CTRL+p CTRL+q
)从附加的容器中分离,以及当容器启用 TTY(-t
)启动时 docker attach
命令的行为变化。最后,你学会了如何在附加到容器时覆盖默认的分离按键组合,这为管理容器交互提供了更大的灵活性。