比较 Docker Stop 与 Kill:何时使用各命令
通过理解 `docker stop` 和 `docker kill` 之间的关键区别,精通 Docker 容器管理。了解何时使用 `SIGTERM` 进行优雅停机以确保数据完整性,以及何时需要 `SIGKILL` 来立即终止无响应的容器。本指南提供实用的示例和最佳实践,帮助您选择正确的命令,从而实现最佳的应用程序稳定性和高效的工作流程。
Docker Stop 与 Kill 对比:何时使用每个命令
当您的容器需要关闭时,docker stop 和 docker kill 不可互换。当您的应用写入数据、持有网络连接或需要清理时间才能退出时,这种区别最为重要。
使用 docker stop 进行正常关闭。当您需要立即发送信号时使用 docker kill,通常是因为容器忽略了优雅停止或您正在测试故障行为。
理解 docker stop
docker stop 命令要求容器的主进程干净退出。默认情况下,Docker 向容器内的 PID 1 发送 SIGTERM,等待一个宽限期,然后如果进程仍在运行则发送 SIGKILL。
第一个信号可以通过镜像的 STOPSIGNAL 指令或创建容器时使用的 --stop-signal 选项更改。但在大多数日常情况下,您可以将 docker stop 视为“向应用发送关闭请求,仅当它不退出时才强制关闭”。
- 保存其当前状态。
- 关闭打开的网络连接。
- 释放其持有的资源。
- 完成任何正在进行的操作(如将数据写入磁盘)。
在 Linux 容器上,默认等待时间通常为 10 秒,除非为容器配置了不同的停止超时。Windows 容器使用更长的默认值。您可以使用 -t 或 --time 为每个命令覆盖等待时间。
docker stop 的工作原理
- 发送
SIGTERM:Docker 向容器内的主进程(PID 1)发送SIGTERM信号。 - 等待宽限期:Docker 等待进程退出。
- 发送
SIGKILL(如果需要):如果进程在宽限期结束时仍未退出,Docker 发送SIGKILL信号。
何时使用 docker stop
- 正常应用关闭:这是停止需要干净关闭的应用的首选方法,例如数据库、Web 服务器或执行关键写入的应用。
- 开发环境:在开发过程中进行常规停止时,
docker stop确保您不会意外中断正在进行的进程。 - 生产环境中的计划维护:当您需要重启服务或执行更新时,
docker stop允许应用完成其工作。
示例
# 启动一个名为 'my-web-server' 的容器
docker run -d --name my-web-server -p 80:80 nginx
# 优雅停止容器
docker stop my-web-server
# 验证容器已停止
docker ps -a | grep my-web-server
如果您的应用需要更多时间来刷新队列或关闭数据库连接,请给予更长的超时时间:
docker stop --time 30 my-web-server
理解 docker kill
docker kill 命令立即向容器的主进程发送信号。默认情况下,该信号是 SIGKILL。与 SIGTERM 不同,SIGKILL 不能被进程捕获、忽略或处理。操作系统结束进程而不给它清理的机会。
这意味着未保存的数据、打开的连接或正在进行的写入可能会被中断。无状态的测试容器可能不在乎。但数据库、队列工作者或文件处理作业可能在乎。
您也可以使用 docker kill --signal 发送不同的信号,例如 SIGHUP,但如果您的意图是优雅关闭,docker stop 通常更清晰。
docker kill 的工作原理
- 发送
SIGKILL:Docker 直接向容器内的主进程(PID 1)发送SIGKILL信号。 - 立即终止:进程被操作系统终止。
何时使用 docker kill
- 无响应的容器:当容器卡住且
docker stop即使在宽限期后也无法终止它时。 - 紧急停止:在需要立即停止容器的情况下,无论后果如何,例如安全事件或关键故障。
- 弹性测试:查看您的应用在进程消失而不清理时的行为。
示例
# 启动一个名为 'my-test-app' 的容器
docker run -d --name my-test-app ubuntu sleep infinity
# 强制杀死容器
docker kill my-test-app
# 验证容器已停止
docker ps -a | grep my-test-app
关键区别总结
| 特性 | docker stop |
docker kill |
|---|---|---|
| 发送的信号 | 通常先 SIGTERM,超时后 SIGKILL |
默认 SIGKILL |
| 终止方式 | 优雅,允许清理 | 立即,强制,无清理 |
| 数据完整性 | 通常保持数据完整性 | 有数据损坏或不一致状态的风险 |
| 使用场景 | 正常关闭,计划维护 | 无响应容器,紧急停止 |
| 宽限期 | 是 | 否 |
最佳实践和注意事项
- 始终先尝试
docker stop:对于常规操作,docker stop应该是您的默认选择。它保护您的应用和数据。 - 了解您的应用的信号:应用可以编程处理
SIGTERM信号。确保您的应用的入口点脚本或进程管理器设置为监听并优雅响应SIGTERM。 - 调整
docker stop的宽限期:您可以使用-t或--time标志为docker stop指定自定义宽限期。例如,docker stop -t 30 my-container给容器 30 秒关闭。 - 将
docker kill作为最后手段:仅在docker stop无效或在关键、紧急情况下才使用docker kill。 - 监控容器健康:在 Docker 设置中实施健康检查可以帮助识别变得无响应的容器,使您能够在需要
docker kill之前解决问题。 - 检查 PID 1 行为:如果 shell 包装脚本不将信号转发给实际的应用进程,它们可能会吞掉信号。在入口点脚本中优先使用
exec,以便应用直接接收关闭信号。
实用要点
让 docker stop 成为您的常规习惯,特别是对于有状态的内容。仅在容器无响应、速度比清理更重要或您故意测试崩溃行为时,才使用 docker kill。