当前位置: 首页 > news >正文

Docker Compose healthcheck介绍(监控容器中服务的实际健康状态)数据库健康检查pg_isready

文章目录

  • **功能概述**
  • **核心参数详解**
  • **配置示例**
    • **1. 基础用法**
    • **2. 使用数据库健康检查**
    • **3. 结合 `depends_on` 控制启动顺序**
  • **高级用法**
    • **1. 自定义健康检查脚本**
    • **2. 多种健康检查类型**
      • - **HTTP 检查**:
      • - **TCP 端口检查**:
      • - **Redis 检查**:
  • **健康状态生命周期**
    • 1. **初始状态**:容器启动后状态为 `starting`。
    • 2. **健康检查成功**:状态变为 `healthy`。
    • 3. **连续失败次数达到 `retries`**:状态变为 `unhealthy`。
    • 4. **健康检查恢复成功**:状态重新变为 `healthy`。
  • **常见问题与解决方案**
    • 1. **容器状态为 `Up` 但服务不可用**:
    • 2. **健康检查脚本依赖外部工具(如 `curl`)**:
    • 3. **健康检查频繁失败导致服务重启**:
  • **总结**

功能概述

healthcheck 是 Docker 提供的一项功能,用于监控容器中服务的实际健康状态,而不仅仅是判断容器进程是否在运行。通过定义健康检查规则,Docker 会周期性地执行指定命令或脚本,根据返回结果判断容器是否处于 healthy(健康)或 unhealthy(不健康)状态。此功能在以下场景中尤为重要:

  • 服务依赖管理:确保依赖的服务(如数据库、Redis 等)完全就绪后再启动其他服务。
  • 故障检测与恢复:及时发现服务异常并触发重启或告警。
  • 自动化部署:在容器化应用中实现更可靠的启动流程。

核心参数详解

docker-compose.yml 文件中,healthcheck 的配置通常包含以下参数:

参数名说明示例
test健康检查命令或脚本,返回值为 0 表示健康,非 0 表示不健康。支持 Shell 命令或数组格式。test: ["CMD-SHELL", "curl -sS http://localhost:80 || exit 1"]
interval健康检查的间隔时间(默认 30s)。interval: 10s
timeout单次检查的超时时间(默认 30s)。超时后视为检查失败。timeout: 5s
retries连续失败多少次后标记容器为 unhealthy(默认 3)。retries: 5
start_period容器启动后等待多久才开始首次检查(默认 0s)。适用于需要较长初始化时间的服务。start_period: 20s

配置示例

1. 基础用法

version: '3.7'
services:web-app:image: my-web-app:latesthealthcheck:test: ["CMD-SHELL", "curl -sS http://localhost:80 || exit 1"]interval: 10stimeout: 5sretries: 3
  • 说明:每 10 秒检查一次 Web 服务是否在 localhost:80 上响应成功(HTTP 200)。
  • 条件:如果连续 3 次检查失败,容器状态变为 unhealthy

2. 使用数据库健康检查

version: '3.7'
services:postgres-database:image: postgres:latestenvironment:POSTGRES_USER: userPOSTGRES_PASSWORD: passwordhealthcheck:test: ["CMD-SHELL", "pg_isready -U user -d postgres"]interval: 10stimeout: 5sretries: 5
  • 说明:使用 PostgreSQL 自带的 pg_isready 工具检查数据库是否可连接。
  • 依赖服务:其他服务可通过 depends_oncondition: service_healthy 依赖此服务。

3. 结合 depends_on 控制启动顺序

version: '3.7'
services:postgres-database:image: postgres:latesthealthcheck:test: ["CMD-SHELL", "pg_isready -U user -d postgres"]interval: 10stimeout: 5sretries: 5app:image: my-app:latestdepends_on:postgres-database:condition: service_healthy
  • 说明
    • depends_oncondition: service_healthy 确保 app 服务仅在 postgres-database 健康后启动。
    • 需要 Docker Compose 版本 3.2 或更高。

高级用法

1. 自定义健康检查脚本

将健康检查逻辑封装到脚本中,例如 healthcheck.sh

#!/bin/bash
# healthcheck.sh
curl -sS http://localhost:80 || exit 1

Dockerfile 中复制并配置:

COPY healthcheck.sh /healthcheck.sh
RUN chmod +x /healthcheck.sh
HEALTHCHECK --interval=5s --timeout=3s CMD /healthcheck.sh

2. 多种健康检查类型

- HTTP 检查

test: ["CMD-SHELL", "curl -f http://localhost:80/health || exit 1"]

- TCP 端口检查

test: ["CMD", "nc", "-z", "localhost", "6379"]

- Redis 检查

test: ["CMD-SHELL", "redis-cli ping | grep -q PONG"]

健康状态生命周期

1. 初始状态:容器启动后状态为 starting

2. 健康检查成功:状态变为 healthy

3. 连续失败次数达到 retries:状态变为 unhealthy

4. 健康检查恢复成功:状态重新变为 healthy


常见问题与解决方案

1. 容器状态为 Up 但服务不可用

  • 原因:Docker 默认仅检查容器进程是否运行,不验证服务是否可用。
  • 解决方案:添加 healthcheck 配置,从应用层面验证服务状态。

2. 健康检查脚本依赖外部工具(如 curl

  • 解决方法
    • 在 Dockerfile 中安装依赖工具(如 apt-get install curl)。
    • 使用轻量级替代方案(如 wgetnc)。

3. 健康检查频繁失败导致服务重启

  • 优化建议
    • 增加 intervalretries 参数值。
    • 调整 start_period 以适应服务初始化时间。

总结

通过 healthcheck 功能,可以显著提升容器化应用的可靠性和自动化能力。合理配置健康检查规则,能够有效解决服务依赖和启动顺序问题,避免因依赖服务未就绪导致的系统故障。结合 depends_oncondition: service_healthy,可以构建更健壮的微服务架构。


文章转载自:

http://w0wexBz9.dbnrL.cn
http://0ZrNKhaG.dbnrL.cn
http://iwIx3fhR.dbnrL.cn
http://IQiXuVpO.dbnrL.cn
http://pCdUv2bV.dbnrL.cn
http://b9Sen9rM.dbnrL.cn
http://oe5ILzGP.dbnrL.cn
http://udtKGtRp.dbnrL.cn
http://SGnn4wem.dbnrL.cn
http://ywc2m7u5.dbnrL.cn
http://OABRtcp7.dbnrL.cn
http://bdDtwH2V.dbnrL.cn
http://TFLdWhAV.dbnrL.cn
http://E0dHL9xG.dbnrL.cn
http://Got7qsl4.dbnrL.cn
http://0FkJE3bU.dbnrL.cn
http://gbZA84oW.dbnrL.cn
http://9PL6azWN.dbnrL.cn
http://Xhvw7pq5.dbnrL.cn
http://MjqXyYor.dbnrL.cn
http://SMHzuFxT.dbnrL.cn
http://a4ZyO3o9.dbnrL.cn
http://PkLBzIBG.dbnrL.cn
http://MgITnJFZ.dbnrL.cn
http://gI6Tq7bS.dbnrL.cn
http://SeiX8ZuG.dbnrL.cn
http://6WCufchO.dbnrL.cn
http://BhX3dDdH.dbnrL.cn
http://kU3rDW4z.dbnrL.cn
http://bCpn9zP3.dbnrL.cn
http://www.dtcms.com/a/374011.html

相关文章:

  • 鸿蒙NEXT中SQLite数据库全面实战指南
  • Go语言文件处理实战指南
  • 【鸿蒙(openHarmony)ETS语言实现视频播放器的详细步骤】
  • SpringBoot教程(三十一) | SpringBoot集成SpringSecurity权限框架
  • 第四十九篇-Tesla P40+Fastllm+Hunyuan-A13B-Instruct+CPU+GPU混合部署推理
  • 安装docker遇到的问题1: [Errno 14] curl#35 - “TCP connection reset by peer“
  • 【Debug日志 | 模型loss不降】
  • 千呼万唤始出来 谭维维音乐会官宣北京
  • 如何给智能家居注入“温度”?世强详解无线通信与AI算力背后的创新方案​
  • 金智维的智能财务管理工具有哪些?
  • 嵌入式 - ARM(1):ARM体系结构
  • 关于对鱼眼相机图片进行畸变校正的两种思路
  • mybatis-plus原生的批量插入
  • 设计模式 概述
  • SQL 注入与防御-第九章:平台层防御
  • SCADA与DCS深度集成实践:打破工厂“信息孤岛”,让实时控制更智能
  • 小学挫折教育主题班会PPT课件模板下载
  • 深入理解 MyBatis-Plus 的 `BaseMapper`
  • YOLOv8 TensorRT C++部署实战详解:从XMake构建到推理流水线
  • HTML HTML基础(3)
  • 几何动点问题
  • C++从字符串中移除前导零
  • PPP PRIVATE NETWORK™ 2 企业级虚拟以太网接入综合解决方案介绍
  • 《会“偷听”的石头:声流石的震撼发现》
  • 线程的控制(互斥+同步)
  • SpringBoot中添加健康检查服务
  • Android 开发 - 一些画板第三方库(DrawBoard、FingerPaintView、PaletteLib)
  • Skopeo 工具介绍与 CentOS 7 安装指南
  • 面向对象设计原则(未完)
  • Python数据挖掘实战:从理论到工具