简介
在本实验中,你将学习如何使用 docker stop
命令有效管理 Docker 容器。我们将涵盖停止运行中容器的基础用法,探索控制停止过程的不同选项,包括如何强制停止容器以及如何为停止操作设置超时时间。完成本实验后,你将熟练掌握使用 docker stop
优雅或强制终止 Docker 容器的方法。
💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版
在本实验中,你将学习如何使用 docker stop
命令有效管理 Docker 容器。我们将涵盖停止运行中容器的基础用法,探索控制停止过程的不同选项,包括如何强制停止容器以及如何为停止操作设置超时时间。完成本实验后,你将熟练掌握使用 docker stop
优雅或强制终止 Docker 容器的方法。
在这一步骤中,我们将学习 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 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 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 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
查看包括已停止容器在内的所有容器。