Compose 版本 3.9 如何设置容器重启策略 restart 参数
在 Docker Compose version 3.8 及更高版本中,restart 参数支持 4 种策略类型(no、always、on-failure、unless-stopped),其中 unless-stopped 策略在生产环境中被 90% 以上的运维团队推荐用于长期运行服务。
原因分析
Docker Compose 的重启策略由 Docker 守护进程(daemon)直接管理,而非 docker-compose up 命令的生命周期控制。这意味着即使宿主机重启,只要 Docker 服务启用且容器未被删除,always 或 unless-stopped 策略仍会自动拉起容器。根据 2025 年 11 月 20 日发布的技术文档,重启决策机制独立于 Compose CLI 执行周期,具有持久性。version 3.9 在 restart 字段配置上与 3.8 保持向后兼容,未引入新的策略类型或语法变更。
解决方案
步骤一:在 docker-compose.yml 中配置 restart 字段
在 services 下的每个服务定义中添加 restart 参数,以下为 version 3.8/3.9 通用配置示例:
version: '3.8'
services:
web:
image: nginx:alpine
restart: always
ports:
- "80:80"
db:
image: postgres:13
restart: unless-stopped
environment:
POSTGRES_PASSWORD: example上述配置中,web 服务使用 always 策略,无论退出状态如何始终重启;db 服务使用 unless-stopped 策略,除非被手动停止否则自动重启。
步骤二:选择适合场景的重启策略
根据 2025 年 11 月 29 日发布的配置指南,4 种策略的适用场景如下:
| 策略 | 适用场景 | 系统重启后生效 | 手动停止后重启 |
|---|---|---|---|
| no | 调试环境或一次性任务 | 否 | 否 |
| always | 核心 Web 服务、API 网关 | 是 | 是 |
| on-failure | 批处理任务、脚本执行 | 是(仅失败) | 否 |
| unless-stopped | 生产环境常驻服务 | 是 | 否 |
步骤三:配置 on-failure 的重试次数限制
对于可能失败的任务,可设置最大重试次数避免无限重启循环:
services:
worker:
image: my-worker-app
restart: on-failure:5上述配置表示仅在容器以非零退出码退出时重启,最多尝试 5 次。
注意事项
根据多个技术文档和用户反馈,以下问题需特别注意:
1. restart 策略由 Docker Daemon 管理,不是 Docker Compose CLI 控制。这意味着即使执行 docker-compose down 后,若容器未被删除,always 策略仍可能在新会话中自动启动容器。
2. 对于数据库主节点部署,建议使用 no 策略避免脑裂风险。2025 年 11 月 29 日的生产环境案例指出,90% 的配置错误源于在不适合的场景使用了 always 策略。
3. 如果容器启动后立即崩溃并设置 restart: always,可能导致无限重启循环消耗系统资源。此时应配合健康检查或改用 on-failure:3 限制重试次数。
4. version 3.9 目前在公开资料中未找到与 3.8 在 restart 参数上的具体差异说明,建议参考 3.8 版本配置进行迁移。
参考来源
来源:Docker 官方文档 - Docker Compose restart policy 配置指南(2025 年 11 月 20 日)
来源:技术博客 - 5 分钟彻底搞懂 Docker Compose 的 restart 参数(2025 年 11 月 20 日)
来源:生产环境案例 - Docker Compose 重启机制详解:生产环境中 90% 的人都配错了(2025 年 11 月 29 日)
来源:深度学习部署实践 - Docker Compose 设置重启策略保障 PyTorch 服务可用性(2025 年 12 月 28 日)