如何使用 docker container stop 命令优雅停止容器

DockerDockerBeginner
立即练习

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

简介

在本实验中,你将学习如何使用 docker container stop 命令优雅地停止 Docker 容器。我们将从创建并运行一个简单容器开始,然后探索如何使用默认信号和超时设置来停止容器,接着学习如何自定义停止容器时使用的超时时间和信号。通过这个动手实践,你将掌握有效管理 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-555124{{"如何使用 docker container stop 命令优雅停止容器"}} docker/ps -.-> lab-555124{{"如何使用 docker container stop 命令优雅停止容器"}} docker/stop -.-> lab-555124{{"如何使用 docker container stop 命令优雅停止容器"}} docker/pull -.-> lab-555124{{"如何使用 docker container stop 命令优雅停止容器"}} end

创建并运行简单容器

在这一步中,你将学习如何创建并运行一个简单的 Docker 容器。容器是一种标准的软件单元,它将代码及其所有依赖项打包,使应用程序能够在不同的计算环境中快速可靠地运行。

首先,让我们从 Docker Hub 拉取一个简单的镜像。我们将使用 hello-world 镜像,这是一个非常小的镜像,它只会打印一条消息然后退出。

docker pull hello-world

你应该能看到显示镜像正在被拉取和下载的输出。

Using default tag: latest
latest: Pulling from library/hello-world
...
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest

现在我们已经获取了镜像,可以基于这个镜像运行容器。使用 docker run 命令:

docker run hello-world

当你运行这个命令时,Docker 会从 hello-world 镜像创建一个新容器。容器会执行镜像中定义的命令,在这个例子中就是向控制台打印一条消息。

Hello from Docker!
This message shows that your installation appears to be working correctly.
...

这个输出确认了你的 Docker 安装正常工作,并且你已经成功运行了第一个容器。容器运行了 hello-world 程序后便退出了。

要查看已经运行过的容器(包括已退出的容器),可以使用 docker ps -a 命令:

docker ps -a

你应该能看到 hello-world 容器被列出,状态为 Exited

CONTAINER ID   IMAGE         COMMAND    CREATED         STATUS                      PORTS     NAMES
<container_id>   hello-world   "/hello"   About a minute ago   Exited (0) About a minute ago             <container_name>

输出显示了容器 ID、基于的镜像、运行的命令、创建时间、当前状态以及分配的名称。

使用默认信号和超时停止容器

在本步骤中,你将学习如何使用默认信号和超时设置来停止正在运行的 Docker 容器。当你停止容器时,Docker 会向容器内运行的主进程发送信号。默认情况下,Docker 会发送 SIGTERM 信号,通知进程优雅地关闭。如果进程在默认超时期限内(通常为 10 秒)没有退出,Docker 会发送 SIGKILL 信号强制终止进程。

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

docker pull ubuntu

你应该能看到显示 ubuntu 镜像正在被拉取的输出。

Using default tag: latest
latest: Pulling from library/ubuntu
...
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

现在,以分离模式 (-d) 运行 ubuntu 容器使其在后台运行,并执行一个使其无限期运行的命令(例如 tail -f /dev/null)。

docker run -d ubuntu tail -f /dev/null

该命令将输出容器 ID。

<container_id>

你可以使用 docker ps 命令验证容器正在运行:

docker ps

你应该能看到 ubuntu 容器被列出,状态为 Up

CONTAINER ID   IMAGE     COMMAND               CREATED         STATUS         PORTS     NAMES
<container_id>   ubuntu    "tail -f /dev/null"   About a minute ago   Up About a minute ago             <container_name>

现在,让我们使用 docker stop 命令停止这个正在运行的容器。你可以使用容器 ID 或容器名称。请将 <container_id> 替换为你实际运行的容器 ID。

docker stop <container_id>

该命令将输出被停止的容器 ID。

<container_id>

执行 docker stop 命令后,容器将收到 SIGTERM 信号。Docker 会等待默认超时时间(10 秒)让容器优雅停止。如果容器在该时间内没有停止,Docker 将发送 SIGKILL 信号。

你可以再次运行 docker ps 来验证容器是否已停止。

docker ps

ubuntu 容器不应再出现在 docker ps 的输出中(该命令仅显示正在运行的容器)。要查看所有容器(包括已停止的),请使用 docker ps -a

docker ps -a

你应该能看到 ubuntu 容器被列出,状态为 Exited

CONTAINER ID   IMAGE     COMMAND               CREATED         STATUS                      PORTS     NAMES
<container_id>   ubuntu    "tail -f /dev/null"   About a minute ago   Exited (0) About a minute ago             <container_name>

这确认了容器已成功使用默认信号和超时设置停止。

使用自定义超时停止容器

在本步骤中,你将学习如何停止正在运行的 Docker 容器,并为优雅关闭阶段指定自定义超时时间。当你的应用需要更多或更少时间来完成清理工作再被强制终止时,这个功能非常有用。

我们将使用与上一步相同的 ubuntu 镜像和命令来运行一个持续存活的容器。

首先,以分离模式 (-d) 运行 ubuntu 容器并执行 tail -f /dev/null 命令:

docker run -d ubuntu tail -f /dev/null

该命令将输出容器 ID。

<container_id>

使用 docker ps 验证容器正在运行:

docker ps

你应该能看到 ubuntu 容器被列出,状态为 Up

CONTAINER ID   IMAGE     COMMAND               CREATED         STATUS         PORTS     NAMES
<container_id>   ubuntu    "tail -f /dev/null"   About a minute ago   Up About a minute ago             <container_name>

现在,使用 docker stop 命令停止容器,但这次通过 -t--time 标志指定超时时间。让我们将超时设为 5 秒。请将 <container_id> 替换为你实际运行的容器 ID。

docker stop -t 5 <container_id>

该命令将输出被停止的容器 ID。

<container_id>

当你使用 docker stop -t 5 时,Docker 会发送 SIGTERM 信号并等待 5 秒让容器停止。如果 5 秒后容器仍在运行,Docker 将发送 SIGKILL 信号。

通过运行 docker ps -a 验证容器已停止:

docker ps -a

你应该能看到 ubuntu 容器被列出,状态为 Exited

CONTAINER ID   IMAGE     COMMAND               CREATED         STATUS                      PORTS     NAMES
<container_id>   ubuntu    "tail -f /dev/null"   About a minute ago   Exited (0) About a minute ago             <container_name>

你已成功使用 5 秒的自定义超时时间停止了容器。

使用自定义信号停止容器

在本步骤中,你将学习如何通过发送默认 SIGTERM 之外的其他特定信号来停止正在运行的 Docker 容器。这对于配置为响应不同信号以实现优雅关闭或其他操作的应用程序非常有用。

我们将再次使用 ubuntu 镜像和 tail -f /dev/null 命令来保持容器运行。

以分离模式 (-d) 运行 ubuntu 容器:

docker run -d ubuntu tail -f /dev/null

该命令将输出容器 ID。

<container_id>

使用 docker ps 验证容器正在运行:

docker ps

你应该能看到 ubuntu 容器被列出,状态为 Up

CONTAINER ID   IMAGE     COMMAND               CREATED         STATUS         PORTS     NAMES
<container_id>   ubuntu    "tail -f /dev/null"   About a minute ago   Up About a minute ago             <container_name>

现在,使用 docker stop 命令停止容器,并通过 --signal 标志指定自定义信号。例如,让我们直接发送 SIGKILL 信号。请将 <container_id> 替换为你实际运行的容器 ID。

docker stop --signal SIGKILL <container_id>

该命令将输出被停止的容器 ID。

<container_id>

当你使用 docker stop --signal SIGKILL 时,Docker 会立即向容器中的主进程发送 SIGKILL 信号。该信号无法被进程捕获或忽略,因此进程将立即强制终止,不会有任何优雅关闭期。

通过运行 docker ps -a 验证容器已停止:

docker ps -a

你应该能看到 ubuntu 容器被列出,状态为 Exited

CONTAINER ID   IMAGE     COMMAND               CREATED         STATUS                      PORTS     NAMES
<container_id>   ubuntu    "tail -f /dev/null"   About a minute ago   Exited (137) About a minute ago             <container_name>

请注意,当使用 SIGKILL 停止容器时,退出代码可能会不同(例如 137),这表示非正常终止。

你已成功通过发送自定义信号停止了容器。

总结

在本实验中,你学习了使用 Docker 容器的基础操作步骤。首先从 Docker Hub 拉取了一个简单镜像(hello-world),然后基于该镜像运行了一个容器。这演示了创建和执行容器的基本流程,你通过使用 docker ps -a 检查容器状态验证了其成功运行。

虽然提供的内容未完全展开后续步骤,但通常会引导你使用 docker container stop 命令来停止运行中的容器。这将包括理解停止容器时使用的默认信号和超时设置,并探索如何自定义超时时长和发送给容器的信号,以实现优雅关闭。