Docker健康检查通过HEALTHCHECK指令在镜像构建时定义或docker run时动态指定,以周期性执行命令并依据退出码(0=健康)更新状态;推荐在Dockerfile中固化配置,支持interval、timeout、start-period、retries等选项,并可使用curl、wget或自定义Shell脚本实现多维度检测。
Docker 容器的健康检查(Health Check)不是靠外部脚本“配置进去”,而是通过 HEALTHCHECK 指令在镜像构建时定义,或在 docker run 时用 --health-cmd 等参数动态指定。它本质是一个周期性执行的命令,Docker 根据该命令的退出码(0=健康,非0=不健康)来更新容器状态。
这是最推荐的方式,让健康检查逻辑随镜像固化,便于复现和分发:
HEALTHCHECK 指令,格式为:HEALTHCHECK [OPTIONS] CMD command
HEALTHCHECK --interval=60s --timeout=5s --start-period=30s --retries=3 <br> CMD curl -f http://localhost:8080/health || exit 1
curl -f 会在 HTTP 状态码非 2xx 时自动返回非零退出码,适合直接用于健康检查;若用 wget 或自定义脚本,需确保成功时返回 exit 0,失败时返回非零值。适用于临时调试或不想重建镜像的场景:
docker run -d <br> --health-cmd="curl -f http://localhost:3000/readyz || exit 1" <br> --health-interval=20s <br> --health-timeout=3s <br> --health-start-period=45s <br> --health-retries=2 <br> --name myapp nginx:alpine
curl(如精简版 Alpine),可改用 sh -c 'wget --spider -q http://localhost:3000/readyz || exit 1',或提前把检查脚本 COPY 进镜像并赋予可执行权限。当内置命令不够用(比如要查数据库连接、磁盘空间、多依赖服务连通性),可以写 Shell 脚本:
/health.sh:#!/bin/sh<br>if ! nc -z localhost 5432; then<br> echo "PostgreSQL not reachable"<br> exit 1<br>fi<br>if ! curl -f http://localhost:8080/api/health > /dev/null 2>&1; then<br> echo "API endpoint failed"<br> exit 1<br>fi<br>exit 0
RUN chmod +x /health.shHEALTHCHECK CMD ["/health.sh"]
read)、长阻塞操作(应设超时),且路径、依赖工具(nc、curl)必须存在于容器内。健康检查配置后,可通过以下方式确认效果:
docker ps —— 健康状态会显示在 STATUS 列(如 healthy、unhealthy、starting)docker inspect myapp | jq '.[0].State.Health'(需安装 jq)或直接看原始 JSON 中 State.Health 字段docker exec myapp curl -f http://localhost:8080/health(前提是应用暴露了该端点)——但这只是应用层检查,不是 Docker 的 HEALTHCHECK 执行结果echo 并重定向到文件,或用 --log-level=debug 启动 dockerd(不推荐生产环境)。