Docker 容器重启策略:原理、选型与排障全指南
Docker 容器重启策略:原理、选型与排障全指南
ZhangCurryDocker 容器重启策略:原理、选型与排障全指南
==============================================
在生产环境里,容器可能因为进程崩溃、宿主机重启、OOM 等多种原因退出。合理配置重启策略(Restart Policy)能在“自愈”与“避免雪崩”之间取得平衡。本文用一条命令、一张思维导图和若干实战案例,帮你彻底搞懂 Docker 的四种重启策略。
-———————————————–
一、重启策略是什么
-———————————————–
Docker 在 容器级别 提供四种重启策略,由 --restart 参数控制:
| 策略 | 含义 | 常见场景 | 典型命令 |
|---|---|---|---|
| no | 默认,不自动重启 | 一次性脚本、调试任务 | docker run –restart=no … |
| on-failure[:N] | 仅当退出码≠0 时重启,最多 N 次 | 偶发崩溃、CI 测试 | docker run –restart=on-failure:3 … |
| always | 无论退出码均重启,直到地球停转 | 7×24 服务(API、数据库) | docker run –restart=always … |
| unless-stopped | 同 always,但 管理员手动 docker stop 后不再重启 | 开发、测试环境 | docker run –restart=unless-stopped … |
【腾讯文档】容器重启策略的说明
https://docs.qq.com/sheet/DT3NtdUtNYU5PeFdw?tab=BB08J2
-———————————————–
二、快速选型:30 秒思维导图
-———————————————–
1 | ┌─ 一次性任务? ── yes ──▶ no |
口诀:
“跑完就下班选 no,真崩才救选 on-failure,死也拉起来选 always,你喊停我才停选 unless-stopped。”
-———————————————–
三、修改已有容器的重启策略
-———————————————–
无需重建容器,一条命令即可:
1 | # 把正在运行的容器改成 always |
示例:
no : 默认,不自动重启
always: 无论退出码均重启
-———————————————–
四、高频问题 & 最佳实践
-———————————————–
容器因 OOM 频繁重启
• 先治标:
--restart=on-failure:3防止雪崩。• 再治本:
1 | # 调整内存上限 |
• 用 docker stats、pmap、VisualVM/tracemalloc 等工具排查内存泄漏(详见文末附录)。
Swarm / Compose 用户
• Compose 文件:
1 | services: |
• Swarm 服务:
1 | docker service update --restart-condition on-failure --restart-max-attempts 3 myservice |
宿主机重启后的行为差异
•
no:容器保持停止。•
always / unless-stopped:Docker daemon 启动时会重新拉起容器。• 若使用 systemd 管理 Docker,确保
systemctl enable docker。
-———————————————–
五、实战案例
-———————————————–
案例 1:生产 API 服务
1 | docker run -d --name api \ |
• 7×24 高可用,宿主机重启后自动上线。
• 内存上限 1 GB,防止泄漏拖垮节点。
案例 2:每天凌晨跑批任务
1 | docker run --rm --restart=no mycorp/etl:latest |
• --rm 跑完即删,无需重启策略。
案例 3:开发环境数据库
1 | # docker-compose.yml |
• 开发者可随时 docker-compose stop postgres 调试,重启 Docker 后自动拉起。
-———————————————–
六、附录:内存泄漏排查 3 步曲
-———————————————–
- 现象确认
1 | docker stats --no-stream <container> |
- 根因定位
● Java:jmap -dump:format=b,file=/tmp/heap.hprof <PID> + MAT
● Python:tracemalloc / memory_profiler
● Node:--inspect + Chrome DevTools
- 修复验证
● 本地压测:docker run --memory=512m
● 回归监控:Prometheus 规则 container_memory_working_set_bytes 1 h 上涨 >30 % 报警。
-———————————————–
结语
-———————————————–
重启策略不是“万金油”,而是 “止损 + 自愈” 的第一道闸门。
牢记:先限资源、再排故障、最后选策略,让你的容器既“不死机”也“不捣蛋”。
小小考核下:
如果你的docker容器,一开始没有配置 重启策略, 要怎么把 – restart 的配置,加入到该容器呢 ??



