Docker健康检查通过定期执行命令(如访问/health接口)判断应用是否真正可用,而非仅检测进程是否存在;在Dockerfile中用HEALTHCHECK指令定义,支持interval、timeout、start-period和retries参数,并需命令返回0才视为成功。

Docker 健康检查机制不是看进程是否在跑,而是判断应用是否真能响应请求。它通过定期执行命令(比如访问 /health 接口),根据返回结果决定容器是 healthy、unhealthy 还是 starting,从而避免“容器活着但服务挂了”的假死问题。
在 Dockerfile 中定义健康检查
这是最常用也最推荐的方式,把检查逻辑固化到镜像里: - 用 `HEALTHCHECK` 指令声明检查行为,一个 Dockerfile 只能生效最后一个 - 示例配置: ```dockerfile HEALTHCHECK --interval=20s --timeout=5s --start-period=40s --retries=3 \ CMD curl -f http://localhost:8080/health || exit 1 ``` - 各参数含义: - `--interval=20s`:每 20 秒检查一次 - `--timeout=5s`:命令超时 5 秒即判失败(别设太短,避免误杀;也别太长,影响故障发现速度) - `--start-period=40s`:容器启动后前 40 秒内失败不计入重试(给慢启动应用留缓冲) - `--retries=3`:连续失败 3 次才标为 `unhealthy`注意:CMD 后的命令必须返回退出码 0 才算成功;非 0(如 curl 失败、端口不通、HTTP 非 2xx)即失败。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
在 docker-compose.yml 中配置 healthcheck
适合多服务编排场景,覆盖或覆盖镜像中已有的 HEALTHCHECK: ```yaml services: web: image: my-web-app healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/health"] interval: 15s timeout: 4s start_period: 30s retries: 3 ``` - `test` 支持三种写法:`["CMD", ...]`(推荐)、`["CMD-SHELL", "command"]`、或直接写字符串(不推荐,易出 shell 解析问题) - `start_period` 和 `retries` 必须是整数,不能带单位查看和验证健康状态
容器运行后,可通过以下方式确认检查是否生效: - 查看当前状态: ```bash docker inspect --format='{{.State.Health.Status}}'配合重启策略实现自动恢复
健康检查本身不会重启容器,需搭配 `--restart` 策略才能形成闭环: - `--restart=on-failure:5`:仅当容器退出码非 0 时重启,最多 5 次 - `--restart=unless-stopped`:更常用于生产,配合健康检查 + 编排工具(如 Swarm/K8s)做剔除或重建 - 注意:单纯 `unhealthy` 不触发重启,只有容器实际退出(exit)才会由 restart 策略接管;若要“健康异常就重启”,得靠外部监控脚本或编排平台联动不复杂但容易忽略

















