简介
在本实验中,你将学习如何使用 docker restart
命令高效管理 Docker 容器。首先,你将了解重启运行中容器的基本流程,这是应用变更或解决问题的基础操作。
在此基础上,你将探索更高级的重启选项。包括为重启过程指定自定义超时时间,从而控制 Docker 在强制终止前等待容器优雅停止的时长。最后,你将学习如何使用特定信号(signal)重启容器,实现对容器重启期间关闭行为的精细控制。
在本实验中,你将学习如何使用 docker restart
命令高效管理 Docker 容器。首先,你将了解重启运行中容器的基本流程,这是应用变更或解决问题的基础操作。
在此基础上,你将探索更高级的重启选项。包括为重启过程指定自定义超时时间,从而控制 Docker 在强制终止前等待容器优雅停止的时长。最后,你将学习如何使用特定信号(signal)重启容器,实现对容器重启期间关闭行为的精细控制。
在这一步骤中,你将学习如何重启正在运行的 Docker 容器。当你需要应用配置变更、修复问题或简单刷新容器状态时,重启容器是一个常见操作。
首先,让我们拉取一个简单的 Nginx 镜像作为示例。我们将使用 nginx:latest
镜像。
docker pull nginx:latest
你应该能看到显示镜像正在被拉取和提取的输出信息。
接下来,我们将基于这个镜像运行一个容器。我们使用 detached 模式 (-d
) 让它在后台运行,并为其指定名称 (--name my-nginx
)。
docker run -d --name my-nginx nginx:latest
该命令将启动 Nginx 容器并打印其容器 ID。
要验证容器是否正在运行,可以使用 docker ps
命令。
docker ps
你应该能看到 my-nginx
容器被列出,状态为 Up
。
现在,让我们使用 docker restart
命令后接容器名称来重启正在运行的容器。
docker restart my-nginx
该命令将停止容器然后重新启动它。
要确认容器已重启并再次运行,可以再次使用 docker ps
。
docker ps
你应该会再次看到 my-nginx
容器被列出,且 STATUS
列显示为 Up
,并带有表示最近启动的时间信息。
在这一步骤中,你将学习如何使用特定超时时间重启 Docker 容器。当你重启容器时,Docker 会向容器内的主进程发送停止信号(默认为 SIGTERM
)。如果进程未在指定时间内退出,Docker 会发送终止信号(SIGKILL
)强制其停止。默认超时时间为 10 秒。你可以通过 docker restart
命令的 -t
或 --time
参数来调整这个超时时间。
让我们使用上一步创建的 my-nginx
容器。首先确保它正在运行:
docker ps
如果容器未运行,请重新启动它:
docker start my-nginx
现在,我们将以 5 秒超时时间重启容器。这意味着 Docker 在发送停止信号后会等待 5 秒,然后才会发送终止信号。
docker restart -t 5 my-nginx
你应该能看到打印出的容器名称,表示重启命令已执行。
要观察超时效果,通常需要一个关闭时间超过默认 10 秒的容器。不过在本练习中,我们主要关注命令语法。
让我们尝试使用更长的超时时间(比如 20 秒)来重启:
docker restart --time 20 my-nginx
同样,你会看到打印出的容器名称。
-t
或 --time
选项非常有用,特别是当容器中运行的应用程序需要在关闭前执行较长时间的清理操作时。
要确认容器在重启后仍在运行,可以使用 docker ps
:
docker ps
你应该能看到 my-nginx
被列出,状态为 Up
。
在这一步骤中,你将学习如何通过向容器主进程发送特定信号来重启 Docker 容器。虽然 docker restart
默认会先发送停止信号(SIGTERM
),在超时后再发送终止信号(SIGKILL
),但根据容器内运行的应用程序不同,你可能需要发送其他信号。这可以通过先使用 docker stop
配合特定信号停止容器,再用 docker start
重新启动来实现。
让我们再次使用 my-nginx
容器。首先确保它正在运行:
docker ps
如果未运行,请启动它:
docker start my-nginx
现在,我们将通过发送 SIGKILL
信号来停止容器。该信号会立即终止进程,不允许其执行任何清理操作。
docker stop -s SIGKILL my-nginx
你应该能看到打印出的容器名称,此时运行 docker ps
将看不到该容器:
docker ps
容器现已停止。要重启它,只需再次启动:
docker start my-nginx
容器现在应该已重新运行。可通过以下命令验证:
docker ps
你应该能看到 my-nginx
被列出,状态为 Up
。
虽然 SIGKILL
是强制停止信号,但如果你的应用程序配置了优雅关闭或重载处理,也可以发送其他信号如 SIGHUP
或 SIGINT
。不过 nginx
容器的默认配置已能优雅处理 SIGTERM
信号。
让我们再次停止容器,这次使用默认的 SIGTERM
信号(当 docker stop
未指定信号时默认使用):
docker stop my-nginx
验证容器已停止:
docker ps
最后,再次启动容器:
docker start my-nginx
确认其运行状态:
docker ps
通过结合使用 docker stop -s <信号>
和 docker start
,你可以在重启前更精细地控制容器的停止方式。
在本实验中,你学习了使用 docker restart
命令重启运行中 Docker 容器的基本流程。通过实践,你掌握了拉取 Docker 镜像、以分离模式运行容器、验证容器状态以及成功重启容器的完整操作。
此外,你还探索了如何通过 -t
或 --time
参数指定超时时间来控制重启过程,这使你可以调整 Docker 在强制终止容器前等待其优雅停止的时间。