做Docker部署的小伙伴大概率都遇到过这个问题:服务器意外重启、程序崩溃、内存溢出、端口冲突,容器直接退出,服务彻底挂掉,没人值守就一直断服。
其实不用手动盯守、不用写复杂脚本,Docker Compose 自带的自动重启策略,就能实现容器异常自愈、开机自启、崩溃自动恢复,是生产环境必备的基础配置。
今天一文讲透 Compose 四种重启策略、实战配置、场景选型、避坑要点,新手直接抄作业,运维直接落地生产。
一、为什么一定要配置容器自动重启?
默认情况下,Docker 容器退出后不会自动重启,这会导致诸多问题:
- 服务器重启后,所有容器全部静默挂停,服务无法自动恢复
- 程序偶发崩溃、代码报错、OOM 内存溢出,容器退出后无人拉起
- 临时网络波动、依赖服务未就绪,导致容器启动失败,无法重试
而开启 Compose 自动重启后,能实现核心能力:异常崩溃自动重启、服务器开机自启、短时故障自动恢复,极大提升服务稳定性,减少人工运维成本。
二、Docker Compose 四大重启策略详解
在 docker-compose.yml 中,通过 restart 字段配置重启策略,一共四种取值,适配所有开发、测试、生产场景,区别和用法一目了然:
1. restart: no(默认策略)
默认配置,容器无论什么原因退出,都不会自动重启。
适用场景:本地调试、一次性执行任务、数据迁移脚本、临时测试容器,不需要常驻运行的服务。
2. restart: always(始终重启)
最强重启策略:只要容器停止,就无条件重启,无论程序是正常退出(退出码0)还是异常崩溃(非0退出码)。
同时支持开机自启:Docker 服务重启、服务器重启后,容器会自动拉起。
缺点:如果程序永久报错(如配置错误、端口占用),会陷入无限重启死循环,占用服务器资源。
适用场景:核心常驻服务、必须7×24运行的基础服务。
3. restart: on-failure(异常重启)
精准自愈策略:仅容器异常退出(非0退出码)时重启,正常手动停止、正常退出不重启。
支持配置最大重启次数,避免无限重启,格式:on-failure: 次数,例如 on-failure: 5 代表最多重试5次。
适用场景:API服务、后端程序、定时任务、无状态服务,只需要修复崩溃故障,无需重启正常退出的容器。
4. restart: unless-stopped(生产最优)
生产环境首选策略,兼顾稳定性和可控性。
规则:除了手动执行 docker stop 停止容器之外,其余所有场景全部自动重启。服务器重启、Docker重启、程序崩溃、异常退出,都会自动拉起容器。
核心优势:不用怕无限重启死循环,手动停服务后不会自动复活,运维可控;常驻服务稳定性拉满。
适用场景:线上所有常驻业务服务、数据库、缓存、网关、监控服务等。
三、完整实战配置(直接复制可用)
给大家整理了一份通用生产配置,包含不同场景的重启策略,开箱即用,适配 Compose 3.8+ 所有版本。
version: '3.8'
services:
# 线上常驻业务服务(生产首选)
nginx:
image: nginx:alpine
ports:
- "80:80"
restart: unless-stopped
# 后端API服务(异常才重启,限制重试次数)
api-server:
image: my-api:latest
ports:
- "8080:8080"
restart: on-failure:5
# 临时调试/一次性任务服务
temp-task:
image: python:3.9
command: python task.py
restart: no
# 核心基础服务(无条件常驻)
redis:
image: redis:alpine
ports:
- "6379:6379"
restart: always
四、精细化进阶:自定义重启延迟与重试规则
基础 restart 字段只能简单控制重启逻辑,如果需要精细化管控(重启延迟、最大重试次数、重启条件),可以使用 deploy.restart_policy 配置,适合复杂生产环境。
version: '3.8'
services:
app:
image: my-app:latest
deploy:
restart_policy:
condition: on-failure # 仅异常退出重启
delay: 3s # 重启前等待3秒
max_attempts: 5 # 最大重试5次
window: 30s # 30秒内统计重试次数
适用场景:服务启动依赖其他组件、启动较慢、需要规避短时抖动的业务。
注意:
deploy配置默认兼容单机 Compose 启动,在docker compose up模式下可正常生效,无需开启集群模式。
五、关键避坑指南(90%的人都会踩坑)
1. 慎用 restart: always 生产乱用
如果服务配置文件错误、端口冲突、依赖缺失,always 会无限重启,占用CPU和内存,导致服务器负载飙升,掩盖真实故障。
解决方案:常驻业务优先用 unless-stopped,不稳定服务用 on-failure: 次数 限制重试。
2. 重启策略不代表服务健康
Compose 重启只判断容器进程是否退出,不判断服务是否可用。比如容器启动成功,但程序卡死、接口报错,重启策略不会触发。
进阶优化:搭配 healthcheck 健康检查,实现真正的服务自愈,进程存活但服务异常也能重启。
3. 手动停止容器的区别
unless-stopped 模式下:
docker stop 容器名:手动停止,不会自动重启(运维可控)- 服务器重启、Docker重启、程序崩溃:自动重启(业务保活)
4. 修改重启策略必须重载生效
修改 docker-compose.yml 的重启配置后,直接重启容器不生效,需要执行:
# 重新加载配置并重启服务
docker compose up -d
六、场景快速选型总结
| 重启策略 | 核心规则 | 最佳使用场景 |
|---|---|---|
| no | 永不重启 | 本地调试、一次性任务、数据迁移 |
| always | 无条件重启 | 核心基础服务、极简常驻服务 |
| on-failure:N | 异常退出重启,限制次数 | 后端API、定时任务、无状态服务 |
| unless-stopped | 仅手动停止不重启 | 生产所有常驻业务(首选) |
七、最终总结
Docker Compose 自动重启是低成本、高收益的运维配置,不用复杂监控、不用自研脚本,就能大幅提升服务可用性:
- 开发调试用 restart: no,避免多余重启干扰开发
- 业务服务用 restart: on-failure:5,精准自愈、避免死循环
- 生产常驻服务统一用 restart: unless-stopped,稳定可控、开箱即用
建议所有线上 Compose 项目必须配置重启策略,从根源避免服务无故挂死,降低运维压力!