compose中restart策略与healthcheck关系
docker-compose中restart策略 与healthcheck` 健康检查的关系、区别与组合使用建议
1. restart 策略详解(控制容器崩溃后是否自动重启)
配置方式(位于 docker-compose.yml 的服务下):
1 | restart: always # 永远重启 |
特点:
| 策略名 | 自动重启 | 仅失败时重启 | 手动 stop 后是否重启 |
|---|---|---|---|
no(默认) |
❌ | ❌ | - |
always |
✅ | ❌ | ✅ |
on-failure |
✅ | ✅ | ❌ |
unless-stopped |
✅ | ❌ | ❌(如果 stop) |
⚠️ restart 是基于进程退出码判断,不依赖健康检查。
2. healthcheck 健康检查详解(标记容器状态,但不自动重启容器)
配置方式(在 docker-compose.yml 的服务下):
1 | healthcheck: |
健康检查参数说明:
| 参数 | 含义 |
|---|---|
test |
实际的检测命令,如 curl、ping、shell |
interval |
检查间隔时间 |
timeout |
超时时间 |
retries |
连续失败几次才判定为 unhealthy |
start_period |
容器启动初期的宽限期,不计失败次数 |
检查状态:
- 成功 →
healthy - 失败(连续
retries次) →unhealthy
可以用命令查看状态:
1 | docker inspect --format='{{json .State.Health}}' container_name | jq |
常见误区:健康检查失败触发 restart 自动重启
即使你设置了:
1 | restart: on-failure |
如果容器内的服务挂了、curl 失败了,容器不会因为 unhealthy 被自动重启!
正确组合策略建议:
方案一:容器主动退出触发重启
服务内部监控失败后显式 exit 1,结合:
1 | restart: on-failure |
实现真正的重启。
总结
| 项目 | restart 策略 |
healthcheck |
|---|---|---|
| 控制什么? | 是否自动重启容器 | 容器是否“健康” |
| 能否触发重启 | ✅(进程崩溃) | ❌(不自动触发重启) |
| 推荐搭配 | on-failure + 服务自退 |
搭配 autoheal 使用 |