compose中restart策略与healthcheck关系

docker-composerestart策略 与healthcheck` 健康检查的关系、区别与组合使用建议


1. restart 策略详解(控制容器崩溃后是否自动重启

配置方式(位于 docker-compose.yml 的服务下):

1
2
3
restart: always         # 永远重启
restart: on-failure # 进程退出码 != 0 时重启
restart: unless-stopped # 永远重启,除非手动 stop

特点:

策略名 自动重启 仅失败时重启 手动 stop 后是否重启
no(默认) -
always
on-failure
unless-stopped ❌(如果 stop)

⚠️ restart 是基于进程退出码判断,不依赖健康检查。


2. healthcheck 健康检查详解(标记容器状态,但不自动重启容器

配置方式(在 docker-compose.yml 的服务下):

1
2
3
4
5
6
healthcheck:
test: curl -f http://localhost:8080/health || exit 1
interval: 30s
timeout: 10s
retries: 3
start_period: 10s

健康检查参数说明:

参数 含义
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
2
3
restart: on-failure
healthcheck:
...

如果容器内的服务挂了、curl 失败了,容器不会因为 unhealthy 被自动重启


正确组合策略建议:

方案一:容器主动退出触发重启

服务内部监控失败后显式 exit 1,结合:

1
restart: on-failure

实现真正的重启。

总结

项目 restart 策略 healthcheck
控制什么? 是否自动重启容器 容器是否“健康”
能否触发重启 ✅(进程崩溃) ❌(不自动触发重启)
推荐搭配 on-failure + 服务自退 搭配 autoheal 使用