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

docker 容器健康检测与重启

docker 容器健康检测与重启

health-check.py

import docker
import time
import logging# ============================
# Logger 配置
# ============================
logger = logging.getLogger("autoheal")
logger.setLevel(logging.INFO)fmt = logging.Formatter("%(asctime)s [%(levelname)s] [autoheal] %(message)s")
ch = logging.StreamHandler()
ch.setFormatter(fmt)
logger.addHandler(ch)# ============================
# Docker 客户端
# ============================
client = docker.DockerClient(base_url='unix://var/run/docker.sock')CHECK_INTERVAL = 60
RETRY_TIMES = 3def get_health(container):try:container.reload()    # 刷新状态state = container.attrs["State"]# 容器已经停止,无需检测健康,直接返回 stoppedif state.get("Status") in ["exited", "dead", "created"]:return "stopped"if "Health" in state:return state["Health"]["Status"]   # healthy / unhealthy / startingelse:return "no-healthcheck"except Exception as e:return f"error: {e}"def check_and_restart():containers = client.containers.list(all=True)for container in containers:name = container.namestatus = get_health(container)# ------- 输出状态 -------logger.info(f"[{name}] Current health/state: {status}")# ------- 停止的容器不处理 -------if status == "stopped":logger.info(f"[{name}] Container stopped (Exited). Skip.")continue# ------- 无健康检查,跳过 -------if status == "no-healthcheck":logger.info(f"[{name}] No HEALTHCHECK. Skip.")continue# ------- 健康,不处理 -------if status == "healthy":continue# ------- 不健康,进行三次重试 -------if status == "unhealthy":logger.warning(f"[{name}] Unhealthy! Starting retry checks...")for retry in range(1, RETRY_TIMES + 1):time.sleep(CHECK_INTERVAL)status = get_health(container)logger.info(f"[{name}] Retry {retry}/{RETRY_TIMES}: {status}")# 可能已经被 stop 掉if status == "stopped":logger.info(f"[{name}] Container is stopped during retry. Skip restart.")breakif status == "healthy":logger.info(f"[{name}] Back to healthy. No restart needed.")breakelse:# 3 次全部 unhealthy,执行重启logger.warning(f"[{name}] Still unhealthy after {RETRY_TIMES} retries. Restarting...")container.restart()logger.info(f"[{name}] Restart issued.")if __name__ == "__main__":logger.info("=== Autoheal service started ===")while True:check_and_restart()time.sleep(10)   # 主循环每 10s 执行一次

Dockerfile

FROM python:3.10-slimRUN pip install dockerCOPY check_health.py /check_health.pyCMD ["python", "/check_health.py"]

构建镜像

docker build -t health-check:v1.0 .

启动检测容器

docker run -d \-v /var/run/docker.sock:/var/run/docker.sock \-v /etc/localtime:/etc/localtime \--name health-checker \health-check:v1.0
http://www.zskr.cn/news/78706.html

相关文章:

  • 2025年12月标书制作服务标杆企业推荐:拆除工程标书、市政工程标书、道路工程标书、重庆睿标通招投标咨询有限公司
  • 什么是跨网文件交换系统?一个案例让你全面了解!
  • 2025年12月恒温恒湿机最新推荐厂家:机房、档案室、展柜专用设备选型指南​
  • 2025年EPE珍珠棉板材厂家权威推荐榜单:EPE珍珠棉卷材‌/EPE珍珠棉异型材‌/珍珠棉异型材‌‌源头厂家精选
  • 完整教程:如何安全配置Linux服务器【完整指南】
  • 北京电动轮椅2025年12月全维度测评:续航/安全/性价比TOP10权威榜单
  • 2025年面包教学机构最新推荐榜:专业面包教学、窑烤面包教学、创业培训、职业认证新标准
  • 2025年12月北京/天津电动轮椅实体店避坑实录:用户真实反馈,好麦迪凭实体店服务封神
  • 基于MATLAB的ADI方法求解偏微分方程详解
  • 2025年靠谱的不锈钢电镀用户口碑最好的厂家榜
  • 2025年热门的165度异型铰链厂家最新实力排行
  • 2025年可靠的高端养老院服务力榜
  • 2025年五大上海座椅电梯安装公司排行榜,专为老人设计爬楼神
  • PKHV3020高压衰减棒在不同频率脉冲信号测量中的示波器设置优化指南
  • 最近在做啥 (2025.11 - 2025.12)
  • 2025老人上下楼梯专用座椅电梯TOP5推荐:智能化品牌深度
  • 2025年评价高的低温冷却液循环泵选型厂家推荐及采购指南
  • Agilex 5 SDM简介
  • 2025年知名的洗地机租赁/驾驶式洗地机厂家推荐及采购参考
  • 2025 年 12 月成都室内异味治理服务权威推荐榜:专业上门祛味,高效除醛净味,打造清新健康生活空间
  • SMT32H7系列DMA和DMAMUX的一点理解
  • 2025年质量好的石英舟/石英定制厂家最新权威实力榜
  • 探寻口碑不错的舞蹈艺考培训学校,一铭艺术学校脱颖而出
  • 2025 年 12 月无锡旅行社口碑 TOP1:万达国旅五区深耕,品质服务成全民首选
  • 口碑好的舞蹈艺考辅导机构推荐:一铭艺术学校
  • 2025 年 12 月上海假发品牌权威推荐榜:伊薇卡手工真人发丝,逼真舒适重塑自信,涵盖男女式、医疗化疗及老年全头套假发精选
  • 2025年口碑好的顶管机/顶管机设备实力厂商TOP榜(专业)
  • 2025年质量好的土压盾构机/隧道盾构机厂家推荐及采购指南
  • 2025 年高定家具 TOP5:为什么越看越乱?一篇避坑指南讲明白
  • 完整教程:Java Maven Log4j 项目日志打印