重启循环长什么样
重启循环指容器反复退出又被自动拉起: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 | 应用自身错误 | 配置缺失、依赖连不上、参数非法 |
| 137 | SIGKILL 或内存超限 | 配额内被杀或超时强杀,用 OOMKilled 字段区分 |
| 143 | SIGTERM | 被 stop 或编排滚动更新,属预期行为 |
重启计数很高但退出码正常时,多半不是进程崩溃而是健康检查在循环,先看 State.Health.Log 最近几次的输出与退出码。
用的重启策略是 always 或 unless-stopped 时,容器退出后会被自动拉起,日志与事件都在持续生成,排查前先固定现场再动手。