AI 摘要
AI
正在生成摘要...

Docker 容器健康检查:识别服务异常与配合恢复策略

本文依据 Docker 官方文档整理,核验日期:2026-05-25。关键结论是:HEALTHCHECK 用于标记容器健康状态;普通 restart policy 在容器进程退出后触发,并不会仅因为容器变为 unhealthy 就自动重启它。

健康检查做什么

容器进程仍在运行,并不意味着服务一定能正常响应。Dockerfile 或 Compose 中的 healthcheck 可以周期性执行一条探测命令,根据退出状态把容器标记为 startinghealthyunhealthy

YAML
services:
  app:
    image: your-app:latest
    healthcheck:
      test: ["CMD", "wget", "--spider", "-q", "http://localhost:8080/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 20s
    restart: unless-stopped

使用 wgetcurl 前,应先确认该工具确实存在于容器镜像中;否则健康检查本身会失败。

restarthealthcheck 的关系

这里最容易被误解:

  • healthcheck 失败达到重试阈值后,Docker 会把容器状态标记为 unhealthy
  • restart: unless-stoppedalwayson-failure 处理的是容器进程退出后的重启策略;
  • 对普通 Docker/Compose 容器而言,仅仅变为 unhealthy 并不自动触发 restart policy。

更准确的理解是:

TEXT
健康检查失败 → 状态变为 unhealthy → 由监控、编排平台或人工决定后续恢复动作
容器进程退出 → 按 restart policy 决定是否自动重启

常用参数

YAML
healthcheck:
  test: ["CMD-SHELL", "curl -fsS http://localhost:8080/health || exit 1"]
  interval: 30s
  timeout: 10s
  retries: 3
  start_period: 30s
  • interval:两次检查之间的间隔;
  • timeout:单次检查允许的最长时间;
  • retries:连续失败多少次后判为 unhealthy
  • start_period:启动宽限期,适合启动较慢的服务。

如何实现健康失败后的自动恢复

需要“服务不可用时自动处理”的场景,可以选择:

  • 将健康状态接入告警,让管理员判断并处理;
  • 使用具备健康调度和替换机制的编排平台;
  • 自行设计受控的监控/恢复脚本,并避免无休止重启循环。

不要仅依靠一行 restart: unless-stopped 就认为业务级故障可以自动恢复。

查看健康状态

BASH
docker ps --format 'table {{.Names}}\t{{.Status}}'
docker inspect your-container --format '{{json .State.Health}}'

参考资料

评论