基于本文回答

播面 播面

文解图解播客视频,多维讲透八股文
0
评论

命令 docker stop 和 docker kill 的区别是什么?

在 Docker 中,docker stopdocker kill 都是用来停止正在运行的容器的命令,但它们的工作原理、对待容器内进程的态度以及使用场景有很大的区别。

简单来说:docker stop 是“礼貌地劝降”(优雅停止),而 docker kill 是“强制斩首”(暴力杀死)。

以下是它们的详细区别:


1. 工作原理与信号(Signals)

这是两者最本质的区别,涉及到 Linux 的系统信号机制:

docker stop(优雅停止)

  1. 第一阶段: Docker 首先向容器内的 1 号进程(PID 1,即主进程)发送 SIGTERM (15) 信号。
    • 注:SIGTERM 是一个“请求终止”的信号,进程可以捕获这个信号,并开始执行清理工作(如保存数据、关闭数据库连接、处理完当前请求、释放资源等)。
  2. 等待阶段: Docker 会等待一段时间(默认是 10 秒)。
  3. 第二阶段: 如果在等待时间内容器仍未退出,Docker 才会发送 SIGKILL (9) 信号,强制杀死容器。

docker kill(强制杀死)

  1. 直接阶段: Docker 不会等待,直接向容器内的 1 号进程发送 SIGKILL (9) 信号(或者你指定的其他信号)。
    • 注:SIGKILL 信号不能被进程捕获或忽略,操作系统会立即强行终止该进程。进程没有任何机会进行清理工作。

2. 参数与自定义行为

  • docker stop

    • 可以通过 -t--time 参数修改等待时间(默认 10 秒)。
    • 示例:docker stop -t 30 my_container(等待 30 秒后再强制杀死)。
  • docker kill

    • 可以通过 -s--signal 参数发送 SIGKILL 的其他自定义信号。
    • 示例:docker kill -s SIGINT my_container(向容器发送中断信号,类似于在终端按 Ctrl+C)。

3. 适用场景

特性 docker stop (推荐) docker kill (应急)
数据安全性 。允许进程保存状态、写入磁盘,避免数据损坏。 。可能导致正在写入的数据损坏或丢失。
速度 较慢(可能需要等待数秒)。 极快(瞬间完成)。
适用场景 * 日常维护、更新容器。
* 数据库容器(如 MySQL, PostgreSQL)。
* 需要优雅退出的 Web 服务。
* 容器卡死、无响应(对 SIGTERM 没反应)。
* 紧急情况需要立即释放 CPU/内存资源。
* 调试时需要发送特定信号。

总结比喻

  • docker stop 就像是你点击电脑的“关机”按钮。系统会提示你保存文件,关闭各个软件,最后安全关机。
  • docker kill 就像是你直接拔掉电脑的电源插头。速度极快,但可能会导致文件损坏或系统故障。

最佳实践: 除非容器卡死,否则在日常操作中应始终优先使用 docker stop