轻量级Docker健康检查探针应优先使用curl或nc验证端口连通性,数据库用pg_isready/mysqladmin,复杂逻辑用短脚本,所有探针须通过HEALTHCHECK声明并配置interval、timeout等参数。
编写轻量级 docker 健康检查探针,核心是用最简逻辑验证服务是否“可响应、可工作”,避免耗资源、不超时、不依赖外部组件。
用 curl 或 nc 检查 HTTP 服务端口连通性
适用于 Web 服务(如 Nginx、Flask、Spring Boot):只需确认监听端口有响应,不追求完整业务逻辑。
- 推荐写法:`curl -f http://localhost:8080/health || exit 1`
(
-f让 curl 在 HTTP 非2xx/3xx时失败,配合|| exit 1触发健康失败) - 更轻量替代:`nc -z localhost 8080 || exit 1` (仅检测端口是否开放,毫秒级,适合无 HTTP 接口的 TCP 服务)
- 注意:容器内需预装
curl或netcat;Alpine 镜像建议用apk add --no-cache curl安装
用 pg_isready 或 mysqladmin 检查数据库连接就绪
避免应用启动后因 DB 还没 ready 就发起连接报错——健康检查应早于业务代码依赖 DB 的时刻。
- PostgreSQL:`pg_isready -U $PGUSER -d $PGDATABASE -h localhost -p 5432 || exit 1`
- MySQL:`mysqladmin ping -h localhost -P 3306 -u $MYSQL_USER -p"$MYSQL_PASSWORD" --silent || exit 1`
- 关键点:使用环境变量传参,避免硬编码;加
--silent或-q减少输出,降低干扰
自定义 Shell 脚本做最小化业务逻辑校验
当需要确认服务内部状态(如缓存加载完成、配置热更新生效),写一个 5~10 行的脚本比调用复杂工具更可控。
- 示例(检查 Redis 是否能 set/get):
`redis-cli -h localhost -p 6379 SET health:test "ok" && redis-cli -h localhost -p 6379 GET health:test | grep -q "ok" || exit 1` - 原则:单行命令优先;必须有明确的
|| exit 1;避免 sleep、循环、日志写入等副作用 - 若脚本稍长,放入镜像
/health.sh,Dockerfile 中设为可执行:RUN chmod +x /health.sh
在 Dockerfile 或 docker-compose.yml 中正确声明 HEALTHCHECK
探针只有被正确注册,Docker 才会周期性执行并更新容器 Health 状态。
- Dockerfile 示例:
`HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=3 \
CMD curl -f http://localhost:3000/health || exit 1` - 关键参数含义:
--interval:每 30 秒检查一次--timeout:单次检查超 3 秒未返回即判失败--start-period:容器启动后前 10 秒内检查失败不计入重试--retries:连续 3 次失败才标为 unhealthy - docker-compose.yml 中等效写法:
`healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 30s
timeout: 3s
start_period: 10s
retries: 3`


















