docker healthcheck指令通过定期执行命令检测服务真实可用性,需配置--interval、--timeout、--start-period、--retries等参数,命令返回0表示健康,须验证业务逻辑而非仅端口连通,并配合编排工具实现自动恢复。
健康检查机制让容器能主动报告自身状态,而不是等外部系统“猜”它是否正常。核心在于用 healthcheck 指令定义一个容器内部可执行的、能真实反映业务可用性的检测逻辑。
关键参数要配准,避免误判
健康检查不是设了就完事,间隔、超时、启动宽限期和重试次数必须匹配应用实际行为:
- --interval=30s:太短会增加负载,太长则故障发现延迟;Web 服务常见 20–60 秒
- --timeout=5s:必须小于 interval,且要大于健康端点平均响应时间(比如你的 /health 接口通常耗时 1.2s,那就设 3s 或 5s)
- --start-period=60s:给慢启动应用留出初始化时间(如 Spring Boot 加载上下文、连接数据库),此期间失败不计数
- --retries=3:连续失败才判 unhealthy,防止单次网络抖动或瞬时 GC 导致误下线
检查命令要贴近真实业务能力
别只测端口通不通,要验证它能不能干正事:
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
- Web 服务:用
curl -f http://localhost:8080/health,后端需返回 HTTP 200 且 body 含有效健康信息(如数据库连通性、缓存可用性) - PostgreSQL:用
pg_isready -U appuser -d mydb,比 telnet 更准——它真去握手并确认角色可读写 - Redis:用
redis-cli -h localhost -p 6379 ping | grep -q "PONG",确保服务响应且协议正常 - 无 curl?改用
sh -c 'echo ok' || exit 1做进程级保底,但仅适用于极简场景
状态要可观测、可联动
配置完不等于生效,得确认它在跑、能看、能触发动作:
- 启动后立刻查:
docker inspect --format='{{.State.Health.Status}}' myapp,初始是starting,之后变healthy或unhealthy - 看失败详情:
docker inspect --format='{{json .State.Health.Log}}' myapp,输出含每次执行时间、退出码、stdout/stderr - 在 docker-compose.yml 中配合 restart_policy:
restart: on-failure,或交给 Swarm/K8s 的 livenessProbe 自动重启 - 注意:Docker 自身不自动重启 unhealthy 容器,需编排工具或脚本监听状态变化后干预
调试常见卡点
如果状态一直卡在 starting 或反复变 unhealthy,优先排查这几项:
- 检查命令在容器内是否真能运行:进容器执行一遍
docker exec -it myapp sh -c "your-health-cmd" - 确认依赖工具已安装(curl、pg_isready、redis-cli 等),没装就加到 Dockerfile 的 RUN 步骤里
- 健康端点路径或权限不对?比如 /health 要求认证,或监听在 127.0.0.1 而非 0.0.0.0
- 日志里显示 “command not found” 或 “connection refused”,说明命令语法错或服务根本没起来










