Docker Compose 重启策略怎么选
容器跑起来不难,难的是它挂了之后该怎么收场。Docker Compose 的 restart 就是管这件事的:容器退出、主机重启、守护进程恢复时,要不要自动拉起,拉起到什么程度,都是它决定的。
Compose 里常见的重启策略就四个:no、always、on-failure、unless-stopped。名字不多,但实际差别不小。很多人把 always 和 unless-stopped 混着用,平时看不出问题,等到人工停过服务、机器重启,行为就开始不一样了。
重启策略类型
可以在服务配置里用 restart 指定:
no:默认值。容器退出后不自动重启。always:不管为什么退出,都尽量重启。on-failure:只有非零退出码才重启,可以附带最大重试次数。unless-stopped:和always很像,但如果你手动停过,它就不会在守护进程恢复时再把它拉起来。
配置示例
version: '3.8'
services:
web:
image: nginx:alpine
restart: always
ports:
- "80:80"
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
restart: on-failure:3
这段配置里,web 更偏向'服务不能断',所以用了 always。db 则只在异常退出时重试三次,避免一个明显起不来的容器一直反复拉起、占资源、刷日志。
策略适用场景
| 策略 | 适用场景 | 是否适合长期运行服务 |
|---|---|---|
| always | Web 服务器、API 服务 | 是 |
| on-failure | 批处理任务、数据库初始化 | 视情况而定 |
| unless-stopped | 后台守护进程、日志收集器 | 很适合 |
| no | 临时调试容器 | 否 |
这里最容易踩坑的是 和 。前者更'强硬',守护进程一恢复就会把容器拉起来;后者会尊重你之前的手动停止。做生产环境维护时,这个差异很实用,至少不会出现你刚停完服务准备排查,机器一重启它又自己回来了。

