如何使用 docker desktop stop 命令管理 Docker Desktop

DockerDockerBeginner
立即练习

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

简介

在本实验中,你将学习如何使用 docker stop 命令有效管理 Docker 容器。我们将涵盖停止运行中容器的基础用法,探索控制停止过程的不同选项,包括如何强制停止容器以及如何为停止操作设置超时时间。完成本实验后,你将熟练掌握使用 docker stop 优雅或强制终止 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/stop("Stop Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") subgraph Lab Skills docker/run -.-> lab-555150{{"如何使用 docker desktop stop 命令管理 Docker Desktop"}} docker/ps -.-> lab-555150{{"如何使用 docker desktop stop 命令管理 Docker Desktop"}} docker/stop -.-> lab-555150{{"如何使用 docker desktop stop 命令管理 Docker Desktop"}} docker/pull -.-> lab-555150{{"如何使用 docker desktop stop 命令管理 Docker Desktop"}} end

理解 docker stop 命令的基础用法

在这一步骤中,我们将学习 docker stop 命令的基础用法。docker stop 命令用于停止一个或多个运行中的容器。默认情况下,该命令会向容器发送 SIGTERM 信号,如果在宽限期内容器仍未停止,则会发送 SIGKILL 信号。

首先,让我们运行一个简单的容器并保持其运行状态。我们将使用 ubuntu 镜像并执行一个让容器持续运行的命令。

docker run -d ubuntu sleep infinity

-d 参数表示以分离模式运行容器,即在后台运行。sleep infinity 是一个让容器无限期保持运行的命令。

现在,让我们列出运行中的容器以获取容器 ID。

docker ps

你应该能看到类似以下的输出,显示你正在运行的 ubuntu 容器:

CONTAINER ID   IMAGE          COMMAND           CREATED         STATUS         PORTS     NAMES
<container_id>   ubuntu         "sleep infinity"   X seconds ago   Up X seconds             <container_name>

<container_id> 替换为你从 docker ps 输出中获取的实际运行容器 ID。现在,使用 docker stop 命令后跟容器 ID 来停止容器。

docker stop <container_id>

执行此命令后,容器应该会停止。你可以通过再次列出运行中的容器来验证这一点。

docker ps

这次,docker ps 命令不应该显示你刚刚停止的容器。

要查看所有容器(包括已停止的),可以使用 docker ps-a 参数。

docker ps -a

这将显示状态为 Exited 的已停止容器。

使用分离选项停止 Docker 容器

在这一步骤中,我们将探索如何使用分离选项停止容器。虽然 docker stop 命令本身不像 docker run 那样具有显式的分离选项,但从终端执行的角度来看,docker stop 本质上就具有分离特性。该命令在发送停止信号后会立即将控制权交还给终端,让你可以继续执行其他任务。

首先让我们运行另一个将要停止的容器。这次我们将使用 nginx 镜像。如果你本地没有该镜像,请先拉取:

docker pull nginx

现在以分离模式运行 nginx 容器:

docker run -d nginx

获取正在运行的 nginx 容器 ID:

docker ps

你将看到类似以下的输出,显示之前的 ubuntu 容器(如果未删除)和新的 nginx 容器:

CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS     NAMES
<nginx_container_id>   nginx          "nginx -g 'daemon off"   X seconds ago   Up X seconds   80/tcp    <nginx_container_name>
<ubuntu_container_id>   ubuntu         "sleep infinity"         Y minutes ago   Exited Y minutes ago             <ubuntu_container_name>

现在使用容器 ID 停止 nginx 容器:

docker stop <nginx_container_id>

当你执行 docker stop 时,命令会发送停止信号并立即将控制权返回给终端。从终端会话的角度来看,这就是"分离"行为——你无需等待容器完全停止就可以输入其他命令。

验证 nginx 容器是否已停止:

docker ps

nginx 容器应该不再出现在运行中的容器列表里。

强制停止 Docker 容器

在这一步骤中,我们将学习如何使用 docker stop 命令强制停止容器。虽然 docker stop 默认会发送优雅停止信号(SIGTERM),但有时容器可能不会响应这个信号,这时就需要强制停止。docker stop 的默认行为会在超时后发送 SIGKILL 信号来实现强制停止。

让我们运行一个可能难以优雅停止的容器。我们将再次使用简单的 ubuntu 容器,但这次会模拟一个忽略 SIGTERM 信号的进程。

docker run -d ubuntu sh -c 'trap "" SIGTERM; sleep infinity'

在这个命令中:

  • trap "" SIGTERM 告诉 shell 忽略 SIGTERM 信号
  • sleep infinity 保持容器持续运行

获取这个新 ubuntu 容器的 ID:

docker ps

你应该能看到这个新的 ubuntu 容器正在运行:

CONTAINER ID   IMAGE          COMMAND                        CREATED         STATUS         PORTS     NAMES
<force_stop_container_id>   ubuntu         "sh -c 'trap \"\" SIGT…"   X seconds ago   Up X seconds             <container_name>
<nginx_container_id>   nginx          "nginx -g 'daemon off"   Y minutes ago   Exited Y minutes ago   80/tcp    <nginx_container_name>
<ubuntu_container_id>   ubuntu         "sleep infinity"         Z minutes ago   Exited Z minutes ago             <ubuntu_container_name>

现在尝试使用标准 docker stop 命令停止这个容器:

docker stop <force_stop_container_id>

由于容器忽略了 SIGTERM 信号,docker stop 会等待默认的宽限期(通常是 10 秒),然后发送无法被忽略的 SIGKILL 信号。这将强制停止容器。你可能会注意到命令完成前有短暂的延迟。

验证容器是否已停止:

docker ps

该容器应该不再显示在运行列表中。

你也可以使用 -t 标志显式指定 0 秒超时,立即发送 SIGKILL 信号,无需等待宽限期就能强制停止容器。我们将在下一步中探讨 -t 标志的用法。

使用超时设置停止 Docker 容器

在本步骤中,我们将学习如何通过 docker stop 命令的 -t--time 标志来设置特定超时时间停止容器。这允许你指定 Docker 在发送 SIGTERM 信号后,应该等待多长时间让容器优雅退出,之后才会使用 SIGKILL 强制停止。

让我们运行一个容器,并使用超时设置来停止它。我们将使用 ubuntu 镜像和一个在退出前等待信号的脚本。

docker run -d ubuntu sh -c 'trap "exit 0" SIGTERM; sleep infinity'

这个命令以分离模式运行一个 ubuntu 容器。trap "exit 0" SIGTERM 部分设置了当脚本收到 SIGTERM 信号时会优雅退出的机制。sleep infinity 保持容器运行直到收到信号。

获取这个新 ubuntu 容器的 ID:

docker ps

你应该能看到这个新的 ubuntu 容器正在运行:

CONTAINER ID   IMAGE          COMMAND                        CREATED         STATUS         PORTS     NAMES
<timeout_container_id>   ubuntu         "sh -c 'trap \"exit 0\"…"   X seconds ago   Up X seconds             <container_name>
<force_stop_container_id>   ubuntu         "sh -c 'trap \"\" SIGT…"   Y minutes ago   Exited Y minutes ago             <container_name>
<nginx_container_id>   nginx          "nginx -g 'daemon off"   Z minutes ago   Exited Z minutes ago   80/tcp    <nginx_container_name>
<ubuntu_container_id>   ubuntu         "sleep infinity"         A minutes ago   Exited A minutes ago             <ubuntu_container_name>

现在使用 -t 标志以 5 秒超时停止这个容器:

docker stop -t 5 <timeout_container_id>

Docker 会发送 SIGTERM 信号并等待 5 秒。由于我们的容器设置为在收到 SIGTERM 时优雅退出,它应该在这个超时时间内停止。如果 5 秒内没有停止,Docker 将会发送 SIGKILL 信号。

验证容器是否已停止:

docker ps

该容器应该不再显示在运行列表中。

当你希望给容器特定的时间来完成清理操作再强制停止时,使用 -t 标志非常有用。

总结

在本实验中,我们学习了使用 docker stop 命令管理运行中容器的基础用法。我们首先了解到 docker stop 会先发送 SIGTERM 信号,在宽限期过后再发送 SIGKILL 信号。通过实践,我们使用 docker ps 获取容器 ID 后,成功停止了以分离模式运行的简单 ubuntu 容器,并执行了 docker stop <container_id> 命令。我们通过再次列出运行中的容器验证了容器的停止状态,同时还学习了如何使用 docker ps -a 查看包括已停止容器在内的所有容器。