HEALTHCHECK 是什么
HEALTHCHECK 在镜像里内置健康检查:Docker 按固定间隔执行指定命令,用退出码判断容器是否健康,docker ps 的 STATUS 列随之出现 (healthy) 或 (unhealthy) 标记。它只负责打标记,不会自动重启容器。
基本信息
| 语法 | HEALTHCHECK [--interval=30s] [--timeout=30s] [--start-period=0s] [--retries=3] CMD 命令 |
|---|---|
| 判定规则 | 退出码 0 为健康,1 为不健康 |
| 状态流转 | starting → healthy 或 unhealthy |
| 关闭检查 | HEALTHCHECK NONE 可禁用基础镜像自带的检查 |
| 查看结果 | docker inspect -f '{{json .State.Health}}' 容器 |
典型使用场景
- 编排里等依赖服务 healthy 之后再启动上游,避免启动时连不上数据库
- 滚动更新时确认新实例真的能响应请求,而不只是进程还活着
- 巡检脚本按健康状态过滤,比只看 running 更接近真实的可用性
- 给冷启动慢的应用加宽限期,避免初始化阶段就被判为故障
- 基础镜像自带的检查不符合项目实际时,先 NONE 关掉再写自己的
示例
示例
HEALTHCHECK --interval=30s --timeout=5s --start-period=40s --retries=3 \
CMD wget -qO- http://localhost:8080/healthz || exit 1
# 关闭基础镜像自带的检查
HEALTHCHECK NONE四个参数怎么定
| 参数 | 作用 | 取值建议 |
|---|---|---|
| --interval | 检查间隔,默认 30s | 比应用响应时间长一个量级,不宜过密 |
| --timeout | 单次检查超时,默认 30s | 略大于健康接口的正常响应时间 |
| --start-period | 启动宽限期,默认 0 | 按冷启动时长设置,期间失败不计入重试 |
| --retries | 连续失败多少次判为不健康,默认 3 | 结合 interval 推算能容忍的总时长 |
start-period 内的失败不计入 retries,专为慢启动应用设计;它在每次容器启动时重新计时,重启后会重新给宽限。
健康检查本身消耗容器内的资源,命令要足够轻。把 /healthz 做成只判断自身状态的接口,比让检查直接去连接下游数据库更稳。
编排层也有等价的健康机制(compose 的 healthcheck、Kubernetes 的 readinessProbe),镜像里的检查不代表编排一定会用;两处配置不一致时以编排为准。