首页/云/Docker 容器速查/重启循环的原因定位
容器排障52 条

重启循环的原因定位

三段证据拼图:inspect 的 RestartCount/ExitCode/OOMKilled、events 的 restart/die 流、logs 尾部错误;循环多为崩溃、健康检查失败或依赖未就绪。

Docker 容器速查云更新于 2026-10-13

重启循环长什么样

重启循环指容器反复退出又被自动拉起:RestartCount 持续上涨,状态在 Restarting 与 Up 之间跳动。原因通常落在这几类——主进程崩溃(配置错误、依赖连不上、端口被占)、健康检查长期失败、依赖服务未就绪导致启动即退出。定位方法是把三段证据拼起来:inspect 里的计数与退出码、events 里的 die/restart 事件流、logs 里退出前的最后几行输出。

基本信息

计数与状态docker inspect 的 RestartCount / State.ExitCode / OOMKilled
事件时间线docker events --filter container=名 --filter event=restart
原因线索docker logs --tail 100 --since 10m 容器
先止血docker update --restart=no 容器

典型使用场景

  • 凌晨告警:容器在半小时内重启几十次,需要先判断是崩溃还是被编排重启
  • 上线后反复退出:新版本启动脚本报错,容器起不来又被策略反复拉起
  • 内存受限排查:退出码 137 且 OOMKilled 为 true,说明是内存配额不足而非代码异常
  • 依赖顺序问题:应用比数据库先启动,连不上就退出,需要依赖等待而不是加大重试
  • 发布窗口评估:确认重启是滚动更新引起的正常替换,而不是故障循环

三段证据采集

三段证据采集
# 计数、退出码、是否被内存杀死
docker inspect -f 'restarts={{.RestartCount}} exit={{.State.ExitCode}} oom={{.State.OOMKilled}} status={{.State.Status}}' web

# 最近半小时的重启事件时间线
docker events --since 30m --filter container=web --filter event=restart

# 退出前的最后输出
docker logs --tail 100 --since 10m web

# 排查期间先关掉自动重启,避免日志被刷掉
docker update --restart=no web

退出码对照

退出码来源常见含义
0正常退出主进程主动结束,多半是启动脚本执行完就返回
1应用自身错误配置缺失、依赖连不上、参数非法
137SIGKILL 或内存超限配额内被杀或超时强杀,用 OOMKilled 字段区分
143SIGTERM被 stop 或编排滚动更新,属预期行为
重启计数很高但退出码正常时,多半不是进程崩溃而是健康检查在循环,先看 State.Health.Log 最近几次的输出与退出码。
用的重启策略是 always 或 unless-stopped 时,容器退出后会被自动拉起,日志与事件都在持续生成,排查前先固定现场再动手。

易错点

  • 带着自动重启策略排查:日志被反复刷掉、资源被反复占用,先 docker update --restart=no 固定现场
  • 把依赖未就绪当崩溃处理:加大重试只是拖长失败循环,编排层加依赖等待或健康检查更治本
  • 只看日志不看退出码:137 与 143 的处理方向完全不同,先分清是内存超限还是收到终止信号
  • 忽略编排层的重启来源:容器看似自己重启,实际是平台按健康检查判死重建,证据要覆盖平台侧事件

数据来源与参考

  • Docker 官方文档:Restart policies 与 docker events(docs.docker.com)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌