Docker Engine 自1.12起原生支持HEALTHCHECK,无需额外安装;只需在Dockerfile、docker-compose.yml或docker run中配置healthcheck参数,并确保--interval、--timeout、--retries、--start-period合理设置,命令返回0/非0码即可生效。
docker engine 本身不需要额外安装健康检查功能——它从 1.12 版本起就原生支持 healthcheck,只要你的 docker engine 是 2016 年中之后发布的稳定版(如 17.05+、20.10+、24.x 等),健康检查能力默认启用,无需安装插件或额外组件。
你真正要做的,是在容器镜像或运行时正确配置健康检查逻辑,让 Docker Engine 能执行并识别它。
怎么让 Docker Engine 执行健康检查?
关键不在“安装”,而在三处明确声明:
- ✅ Dockerfile 中写 HEALTHCHECK 指令(推荐,镜像级统一)
- ✅ docker-compose.yml 中定义 healthcheck 块(推荐,服务级灵活)
- ✅ *docker run 时用 --health- 参数覆盖**(适合调试或临时场景)
只要其中一种方式生效,Docker Engine 就会自动启动周期性探测,并在 docker ps 和 docker inspect 中显示健康状态。
必须写的健康检查核心参数
无论在哪配置,以下 4 个参数决定行为是否合理:
-
--interval=15s:每 15 秒执行一次(太短加重负载,太长延迟发现故障) -
--timeout=5s:单次命令最多跑 5 秒,超时即失败(防 curl hang 住) -
--retries=3:连续 3 次失败才标为unhealthy(避免瞬时抖动误判) -
--start-period=60s:容器启动后宽限 60 秒再开始计数(给 Spring Boot、PostgreSQL 等慢启动服务留足时间)
⚠️ 注意:没设
--start-period,很多 Java 或数据库容器一启动就被判unhealthy,因为健康检查在应用还没监听端口时就开查了。
健康命令怎么写才真正有效?
Docker 只看退出码:0 = healthy,非 0 = unhealthy。所以命令必须确保失败时明确退出非零。
| 服务类型 | 推荐写法 | 说明 |
|---|---|---|
| Nginx / HTTP API | curl -f --max-time 3 http://localhost/health || exit 1 |
-f 拒绝 4xx/5xx,--max-time 防卡死,|| exit 1 强制失败退出码 |
| MySQL 容器 | mysqladmin ping -h 127.0.0.1 -u root --password="$MYSQL_ROOT_PASSWORD" --silent || exit 1 |
用官方工具验连接+权限,不依赖端口通 |
| Redis | redis-cli -h localhost ping \| grep -q "PONG" || exit 1 |
简单可靠,不需额外依赖 |
| 自定义脚本 |
CMD ["/check.sh"](脚本内做 DB 连接 + 缓存 ping + 依赖服务探活) |
复杂业务推荐,但脚本必须轻量、无副作用 |
❌ 避免这些无效写法:
nc -z localhost 8080(Alpine 默认没 nc;且通端口 ≠ 服务就绪)ps aux \| grep myapp(进程在 ≠ 能响应请求)curl http://localhost:3000/(没-f,404 也返回 0)
怎么确认 Docker Engine 真正在跑健康检查?
启动容器后,立刻验证:
# 查看状态是否含 healthy/unhealthy
docker ps
# 查看详细健康信息(含最近一次输出、失败次数)
docker inspect --format='{{json .State.Health}}' <container-id>
# 实时跟踪健康事件(新开终端)
docker events --filter 'event=health_status'如果输出里 Status 是 "starting" 卡很久,大概率是 --start-period 不够或命令路径错误;如果是 "unhealthy",就进容器手动执行一遍健康命令,看具体报什么错。
健康检查 ≠ 自动重启
Docker Engine 发现 unhealthy 不会自动重启容器。它只更新状态。要想自动恢复,得配合:
docker run -d \ --restart on-failure:5 \ --health-cmd="curl -f http://localhost/ || exit 1" \ my-web-app
⚠️ 注意:on-failure 只在容器进程退出且退出码非 0 时触发,不是健康变 unhealthy 就重启。生产中建议用编排工具(Swarm/K8s)联动健康状态做下线或重建。
不复杂但容易忽略。


















