比较 Docker Stop 与 Kill:何时使用各命令

通过理解 `docker stop` 和 `docker kill` 之间的关键区别,精通 Docker 容器管理。了解何时使用 `SIGTERM` 进行优雅停机以确保数据完整性,以及何时需要 `SIGKILL` 来立即终止无响应的容器。本指南提供实用的示例和最佳实践,帮助您选择正确的命令,从而实现最佳的应用程序稳定性和高效的工作流程。

Docker Stop 与 Kill 对比:何时使用每个命令

当您的容器需要关闭时,docker stopdocker 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 的工作原理

  1. 发送 SIGTERM:Docker 向容器内的主进程(PID 1)发送 SIGTERM 信号。
  2. 等待宽限期:Docker 等待进程退出。
  3. 发送 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 的工作原理

  1. 发送 SIGKILL:Docker 直接向容器内的主进程(PID 1)发送 SIGKILL 信号。
  2. 立即终止:进程被操作系统终止。

何时使用 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