如何使用 docker container attach 命令与运行中的容器交互

DockerDockerBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,你将学习如何使用 docker container attach 命令与运行中的容器进行交互。你将通过分离模式(detached mode)启动容器,附加到容器以观察其输出,并使用默认按键组合来分离连接。

你还将探索如何附加到启用了 TTY 的容器,并学习如何覆盖默认的分离按键序列,从而在与 Docker 容器交互时获得更大的灵活性。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/attach("Attach to Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") subgraph Lab Skills docker/run -.-> lab-555103{{"如何使用 docker container attach 命令与运行中的容器交互"}} docker/ps -.-> lab-555103{{"如何使用 docker container attach 命令与运行中的容器交互"}} docker/attach -.-> lab-555103{{"如何使用 docker container attach 命令与运行中的容器交互"}} docker/pull -.-> lab-555103{{"如何使用 docker container attach 命令与运行中的容器交互"}} end

启动运行简单命令的分离式容器

在这一步骤中,你将学习如何以分离模式(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。你现在已附加到容器。若要分离容器并返回终端提示符而不停止容器,请按以下按键组合:

  1. 按住 CTRL 键,然后按下 p 键。释放这两个键。
  2. 按住 CTRL 键,然后按下 q 键。释放这两个键。

按下 CTRL+p 紧接着 CTRL+q 后,你应该会返回到终端提示符。容器将继续在后台运行。你可以使用 docker ps 验证容器是否仍在运行。

docker ps

你应该能看到运行 sleep 60 的容器被列出,状态显示为 Up

启动另一个启用 TTY 的分离式容器

在本步骤中,我们将启动另一个分离式容器,但这次会为容器启用伪终端(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 的容器并使用默认按键组合分离

在上一步骤中,我们启动了一个启用 TTY 的分离式容器。现在,我们将附加到这个容器,并练习使用默认按键组合(CTRL+p 紧接着 CTRL+q)进行分离。附加到启用 TTY 的容器可以实现交互式会话,即使初始命令并不需要交互。

首先,获取你在上一步中启动的、运行 sleep 60 并启用 TTY 的容器 ID。

docker ps

找到运行 sleep 60ubuntu 容器的 ID。

现在,使用 docker attach 命令附加到这个容器,后面跟上容器 ID。

docker attach <container_id>

<container_id> 替换为你容器的实际 ID。你现在已附加到容器的标准流,由于启用了 TTY,你将获得一个类似终端的界面。虽然 sleep 命令不需要交互,但你已连接到容器的虚拟终端。

要从容器分离而不停止它,请使用默认的分离按键组合:

  1. 按住 CTRL 键,然后按下 p 键。释放这两个键。
  2. 按住 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。你现在已附加到容器。要使用新组合分离:

  1. 按住 CTRL 键,然后按下 a 键。释放这两个键。
  2. 按下 d 键。

你应该会返回到终端提示符。容器将继续在后台运行。你可以使用 docker ps 验证容器是否仍在运行。

docker ps

你应该能看到运行 sleep 60 的容器被列出,状态显示为 Up

总结

在本实验中,你学习了如何使用 docker run -d 命令以分离模式启动 Docker 容器,这种方式可以让容器在后台运行而无需附加到终端。随后你练习了使用 docker attach 命令连接到正在运行或已退出容器的标准流,以观察其输出。

此外,你还探索了如何使用默认按键组合(CTRL+p CTRL+q)从附加的容器中分离,以及当容器启用 TTY(-t)启动时 docker attach 命令的行为变化。最后,你学会了如何在附加到容器时覆盖默认的分离按键组合,这为管理容器交互提供了更大的灵活性。