命令 docker stop 和 docker kill 的区别是什么?
在 Docker 中,docker stop 和 docker kill 都是用来停止正在运行的容器的命令,但它们的工作原理、对待容器内进程的态度以及使用场景有很大的区别。
简单来说:docker stop 是“礼貌地劝降”(优雅停止),而 docker kill 是“强制斩首”(暴力杀死)。
以下是它们的详细区别:
1. 工作原理与信号(Signals)
这是两者最本质的区别,涉及到 Linux 的系统信号机制:
docker stop(优雅停止)
- 第一阶段: Docker 首先向容器内的 1 号进程(PID 1,即主进程)发送
SIGTERM(15) 信号。- 注:
SIGTERM是一个“请求终止”的信号,进程可以捕获这个信号,并开始执行清理工作(如保存数据、关闭数据库连接、处理完当前请求、释放资源等)。
- 注:
- 等待阶段: Docker 会等待一段时间(默认是 10 秒)。
- 第二阶段: 如果在等待时间内容器仍未退出,Docker 才会发送
SIGKILL(9) 信号,强制杀死容器。
docker kill(强制杀死)
- 直接阶段: 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。