1. 引言:容器的“死法”也有讲究
在Docker的世界里,容器的生命周期就像一场戏剧:有的优雅谢幕,有的突然“暴毙”。新手常以为docker stop和docker kill都是“关机按钮”,但实际差别堪比“礼貌告别”和“直接拔电源”——一个可能保存数据,一个可能引发灾难!
比如,你正在运行的数据库容器若被误杀,未持久化的数据直接归西;而优雅停止则会给它缓冲时间,完成最后的写入操作。本文将用段子+实战,教你如何正确“处置”容器!
2. 核心概念:停止 vs 杀死,信号是关键
2.1 docker stop:礼貌敲门
- 原理:向容器主进程发送
SIGTERM信号(可捕获),等待一段超时时间(默认10秒)后,若未退出再发送SIGKILL强制终结。 - 适用场景:数据库、微服务等需要清理资源或保存状态的容器。
- 幽默解读:就像对容器说:“给你10秒整理遗言,时间一到直接抬走!”
2.2 docker kill:破门而入
- 原理:直接发送
SIGKILL信号(不可捕获),立即强制终止进程。 - 可选信号:支持指定其他信号(如
SIGINT),但默认是SIGKILL。 - 适用场景:容器卡死、无响应时的紧急处理。
- 幽默解读:容器的“猝死套餐”,连喊“救命”的机会都没有!
2.3 信号机制深度解析
SIGTERM:允许进程捕获并处理,例如关闭文件、释放连接。SIGKILL:内核直接回收资源,进程无法抵抗,易导致数据损坏。
类比:SIGTERM→ 老板说“今天早点下班”(你可以保存工作进度)。SIGKILL→ 突然断电(电脑直接黑屏)。
3. 完整示例:实战停止与杀死
3.1 实验准备:启动一个测试容器
首先,创建一个会持续输出日志的容器(模拟真实服务):
# 启动一个每秒打印时间的容器
docker run --name test-container -d alpine sh -c "while true; do echo $(date); sleep 1; done"
3.2 优雅停止:docker stop
# 发送SIGTERM,等待10秒超时
docker stop test-container
# 查看退出状态(Exit code 137表示正常终止)
docker inspect test-container --format='{{.State.ExitCode}}'
输出日志分析:
容器收到SIGTERM后立即终止循环,退出码为0(优雅退出)。
3.3 强制杀死:docker kill
# 重启容器
docker start test-container
# 直接发送SIGKILL
docker kill test-container
# 检查退出码(Exit code 137表示被强制杀死)
docker inspect test-container --format='{{.State.ExitCode}}'
注意:退出码137 = 128 + 9(9是SIGKILL的信号编号),表示非正常退出。
3.4 自定义信号和超时时间
延长停止超时(给容器20秒处理退出):
docker stop -t 20 test-container
发送自定义信号(如SIGHUP):
docker kill --signal=SIGHUP test-container
4. 常见坑与解决方案
4.1 僵尸进程:容器停了,进程还在?
问题:若容器内进程未正确处理信号,可能成为僵尸进程。
排查:
# 查看主机上的残留进程
ps aux | grep defunct
解决:在Dockerfile中使用exec模式启动进程,确保信号传递:
CMD exec python app.py # 而非 CMD python app.py
4.2 数据持久化:停止前如何备份?
通过挂载卷(Volume)保存数据,并在停止前触发备份脚本:
# 启动时挂载卷
docker run -d -v app-data:/data --name db-container mysql
# 停止前执行备份脚本(需容器内预置脚本)
docker exec db-container /backup.sh
docker stop db-container
4.3 一键清理所有容器
危险操作:强制杀死所有容器(慎用!):
docker kill $(docker ps -q)
推荐方案:停止所有容器,避免数据丢失:
docker stop $(docker ps -q)
5. 总结:如何选择停止还是杀死?
- 用
docker stop:日常关闭、数据库、有状态服务。 - 用
docker kill:容器卡死、测试环境、无重要数据的容器。 - 牢记:
停止是“请存盘后关机”,杀死是“直接拔电源”!
附录:常用命令速查表
|
命令 |
作用 |
风险等级 |
|
|
停止(超时30秒) |
Low |
|
|
强制杀死 |
High |
|
|
发送中断信号(类似Ctrl+C) |
Medium |
|
|
直接删除运行中的容器 |
Critical |
1414

被折叠的 条评论
为什么被折叠?



