重启策略是什么
重启策略定义容器退出后要不要被自动拉起、最多拉起几次。它是容器在无人值守环境里长期运行的基础能力:宿主机重启、进程崩溃、依赖短暂不可用都可能让容器停止,策略决定这些情况下服务能否自己恢复。
基本信息
| 设置位置 | 创建容器时指定,也可对已有容器在线调整 |
|---|---|
| 取值 | 不重启、失败时重启并可限定次数、总是重启、手动停止后不重启 |
| 默认值 | 不自动重启,退出即停止 |
| 生效时机 | 容器退出之后触发,进程运行中不会重复拉起 |
| 外部依赖 | 只负责拉起容器,不负责健康判断与流量摘挂 |
典型使用场景
- 无人值守服务:宿主机夜间重启后业务自动恢复,不必等人工介入
- 依赖启动顺序:依赖服务稍晚就绪时,应用重启几次后能自行连上
- 临时故障自愈:进程偶发崩溃时自动恢复,减少被叫醒的概率
- 批处理容器:按失败状态重启,成功退出后保持停止状态
- 维护窗口:手动停掉的服务在宿主机重启后不应被拉起,避免干扰维护操作
常用示例
常用示例
docker run -d --restart unless-stopped --name web nginx:1.27-alpine # 常驻服务推荐写法
docker run -d --restart on-failure:5 --name job app/batch:1.0 # 失败时最多重启五次
docker run -d --restart no --name oneshot app/task:1.0 # 跑完就结束
docker update --restart on-failure:3 web # 在线调整已有容器
docker inspect -f '{{.HostConfig.RestartPolicy.Name}} {{.RestartCount}}' web # 核对策略与次数策略取值对照
| 取值 | 行为 | 适用场景 |
|---|---|---|
| 不重启 | 退出后保持停止 | 一次性任务、需要人工确认的场景 |
| 失败时重启 | 非正常退出才拉起,可限定次数 | 批处理任务与可容忍失败的服务 |
| 总是重启 | 无论退出码如何都拉起,手动停止后宿主机重启仍会拉起 | 必须常驻的服务,但要接受手动停不干净 |
| 手动停止后不重启 | 自动拉起,但手动停掉后不再随宿主机启动 | 生产常驻服务的推荐选择 |
| 已禁用 | 等价于不重启 | 需要临时停稳但不想改配置的场景 |
崩溃循环怎么处理
- 先看日志尾部,确认是配置错误、依赖连不上还是程序自身缺陷
- 再看重启次数,次数快速增长说明已经陷入循环,此时频繁拉起只是重复失败
- 临时把策略改成不重启,让容器停在原地便于检查现场
- 修好之后重新启动,并在观察窗口内确认状态稳定
- 彻底解决后恢复原策略,避免把临时处置留在生产
与其他机制的分工
- 编排平台的调度策略处理跨主机重建,容器级策略处理单机自愈
- 健康检查判断服务是否还能工作,与重启策略互补
- 监控告警负责通知人,不能依赖它替代自动恢复
- 负载均衡负责摘流,重启期间要把异常实例从流量里移走
- 配置管理保证重启后的容器与预期一致,否则重启只会把错误状态重复一遍
把重启策略与自动删除同时使用会直接报错。需要保留现场或需要自动清理时,二选其一,不要既想清理又要自动拉起。
重启发生在容器退出之后,并且有退避机制,不会高频反复。看到状态不断变化说明容器一直在退出,要先找根因而不是加大重启次数。