首页/云/云与容器速查/Compose 重启策略 restart
容器与 Docker106 条

Compose 重启策略 restart

restart 字段控制容器退出后的自动拉起:开发常用 unless-stopped,常驻服务建议 always/unless-stopped;但它替代不了健康检查。

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

Compose 重启策略是什么

restart 字段控制容器退出后是否被自动拉起。常用取值有四个:no 不自动重启;always 无论退出码如何都重启,宿主重启后也会拉起;on-failure[:max] 只在非零退出时重启,并可以限制最大次数;unless-stopped 与 always 类似,但被手动停止过的容器在 Docker 重启后不会被拉起。它只对『进程退出』生效,进程还活着但服务假死的情况要靠健康检查兜底。

基本信息

取值no / always / on-failure[:max] / unless-stopped
关键差异always 在宿主重启后也拉起;unless-stopped 手动停过就不再拉起
查看方式docker inspect <容器> 的 HostConfig.RestartPolicy
能力边界只对进程退出生效,进程假死不会触发重启
与编排区别Swarm 使用 deploy.restart_policy,字段与语义都不同

典型使用场景

  • 常驻 Web 服务与 API:用 unless-stopped,既能自愈又不被手动停止后的自动拉起干扰维护
  • 任务型 worker:用 on-failure:5 限制重试次数,避免配置错误导致无限重启
  • 本地开发环境:用 no,改代码或调试时不被自动拉起打断
  • 宿主重启后需要自恢复的基础组件:监控采集、日志转发用 always
  • 一次性任务容器:不设重启策略,跑完即退出是预期行为

示例与查看方式

示例与查看方式
services:
  web:
    image: nginx:1.27-alpine
    restart: unless-stopped
  worker:
    restart: on-failure:5

# 查看某容器实际生效的策略
docker inspect -f '{{.HostConfig.RestartPolicy.Name}}' <容器名>
# 查看重启次数与最后退出码
docker inspect -f '{{.RestartCount}} {{.State.ExitCode}}' <容器名>

取值与行为对照

取值正常退出异常退出手动停止后宿主重启
no不重启不重启不重启
always重启重启仍会拉起
on-failure不重启重启(可限次数)不重启
unless-stopped重启重启保持停止状态
启动即崩的容器配上 always 会无限重启并把日志刷爆:先用日志定位根因,再换成 on-failure 并限制次数,避免把故障掩盖成噪音。
重启策略与健康检查是互补的:restart 处理进程退出,健康检查处理进程活着但服务不可用。只有两者配合,容器才具备真正意义上的自愈能力。

易错点

  • 依赖 restart 兜底坏代码:重启循环掩盖原始故障,日志被刷爆,排查成本成倍上升
  • 在 Swarm 部署里期待 restart 生效:Swarm 使用 deploy.restart_policy,字段不同,配置实际未生效
  • 用 always 的服务在维护窗口手动停止后,宿主重启又自动跑起来,与运维预期冲突
  • 给一次性任务容器配 always,任务完成后被反复拉起,造成重复执行或数据重复写入

数据来源与参考

  • Docker Docs:Compose restart
  • Docker Docs:Restart policies

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌