Docker基础教程(127)docker容器之停止和杀死容器:别让容器“死”得不明不白:Docker停止与杀死的终极求生指南!

1. 引言:容器的“死法”也有讲究

在Docker的世界里,容器的生命周期就像一场戏剧:有的优雅谢幕,有的突然“暴毙”。新手常以为docker stopdocker 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:容器卡死、测试环境、无重要数据的容器。
  • 牢记:

停止是“请存盘后关机”,杀死是“直接拔电源”!


附录:常用命令速查表

命令

作用

风险等级

docker stop -t 30

停止(超时30秒)

Low

docker kill

强制杀死

High

docker kill -s INT

发送中断信号(类似Ctrl+C)

Medium

docker rm -f

直接删除运行中的容器

Critical


 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

值引力

持续创作,多谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值