docker中设置容器健康检查

这篇具有很好参考价值的文章主要介绍了docker中设置容器健康检查。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、docker-compose方式

在docker-compose中加入healthcheck
healthcheck 支持下列选项:
test:健康检查命令,例如 ["CMD", "curl", "-f", "http://localhost/actuator/health"]
interval:健康检查的间隔,默认为 30 秒,单位(h/m/s);
timeout:健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认 30,单位(h/m/s);
retries:当连续失败指定次数后,则将容器状态视为 unhealthy,默认 3 次。
start-period:应用的启动的初始化时间,在启动过程中的健康检查失效不会计入,默认 0 秒; (17.05)引入
说明:在此期间的探测失败将不计入最大重试次数。但是,如果健康检查在启动期间成功,则认为容器已启动,所有连续的失败都将计入最大重试次数。

和 CMD, ENTRYPOINT 一样,HEALTHCHECK 只可以出现一次,如果写了多个,只有最后一个生效。

HEALTHCHECK [选项] CMD 后面的命令,格式和 ENTRYPOINT 一样,分为 shell 格式,和 exec 格式。命令的返回值决定了该次健康检查的成功与否:

  • 0:成功;
  • 1:失败;
  • 2:保留值,不要使用

容器启动之后,初始状态会为 starting (启动中)。Docker Engine会等待 interval 时间,开始执行健康检查命令,并周期性执行。如果单次检查返回值非0或者运行需要比指定 timeout 时间还长,则本次检查被认为失败。如果健康检查连续失败超过了 retries 重试次数,状态就会变为 unhealthy (不健康)。

注:

  • 一旦有一次健康检查成功,Docker会将容器置回 healthy (健康)状态
  • 当容器的健康状态发生变化时,Docker Engine会发出一个 health_status 事件。
    healthcheck:
      test: ["CMD","curl","-f","http://localhost:28025/v1/health/check"]
      # 每次间隔30秒检查一次
      interval: 30s
      # 每次检查的超时时间
      timeout: 10s
      # 最多重试检查次数
      retries: 3
      
   # redis检查示例   
   healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 1s
      timeout: 3s
      retries: 30
   
   # postgresql检查   
   healthcheck:
      test: ["CMD", "pg_isready"]
      interval: 1s
      timeout: 3s
      retries: 30
   # mysql检查   
   healthcheck:
      test: ["CMD", "mysql" ,"-h", "mysql", "-P", "3306", "-u", "root", "-e", "SELECT 1", "cache"]
      interval: 1s
      timeout: 3s
      retries: 30

version: '3'
services:
  mysql:
    hostname: mysql
    image: 10.10.3.5/cta/mysql_base:01
    container_name: mysql
    volumes:
      - ./mysql/mysql.cnf:/etc/mysql/conf.d/mysql.cnf
      - ./mysql/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf
      - ./mysql/init:/docker-entrypoint-initdb.d/
      #- ./mysql/data:/var/lib/mysql
    # 给容器赋予root权限  
    privileged: true
    network_mode: "host"
    environment:
      - MYSQL_ROOT_PASSWORD=123
      - TZ=Asia/Shanghai
      - LANG=en_US.UTF-8
    # 健康检查  
    healthcheck:
    # mysqladmin -uroot -p123  ping -h127.0.0.1
      test: [ "CMD", "mysqladmin" ,"ping", "-h", "localhost" ]
#      test: [ "CMD", "mysqladmin","-u","root","-p","123" ,"ping", "-h", "127.0.0.1" ]
      timeout: 45s
      interval: 10s
      retries: 10


  nginx:
    hostname: nginx
    image: nginx:1.20.2
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/platform.conf:/etc/nginx/conf.d/platform.conf
      - ./nginx/svrshell:/root/svrshell
      - ./nginx/aiviewer:/root/aiviewer
# 增加cta
      - ./nginx/dwcta:/root/dwcta
# 增加input挂载
      - /data1/inputdata:/data1/inputdata
    container_name: nginx
    privileged: true
    network_mode: "host"
    environment:
      - TZ=Asia/Shanghai
      - LANG=en_US.UTF-8


  zk:
# zookeeper  修改了zoo.cfg的data和datalog路径 /opt/zk1/zookeeper-3.4.10
    hostname: zk
    image: 10.10.3.5/cta/zookeeper:3.4.10
    healthcheck:
#      test: ["CMD-SHELL", "curl -sS 127.0.0.1:2181 || exit 1"]
      test: ["CMD-SHELL", "echo 'ruok' | curl -s telnet://localhost:2181 || exit 1"]
      interval: 1m30s
      timeout: 10s
      retries: 3
      start_period: 40s
    depends_on:
      mysql:
        # mysql健康检查通过后,才能启动zk服务
        condition: service_healthy
        # condition: service_started
    volumes:
      - ./zk/zoo.cfg:/conf/zoo.cfg
#      - /opt/zk1/zookeeper-3.4.10/data:/data
#      - /opt/zk1/zookeeper-3.4.10/datalog:/datalog
    container_name: zk
    privileged: true
    network_mode: "host"
 #   ports:
 #     - 2181:2181

  es_python:
    hostname: es_python
    image: es_python:1.1
    volumes:
      - /data1/es_data:/usr/share/elasticsearch/data
    container_name: es_python
    privileged: true
    network_mode: "host"
    environment:
      - TZ=Asia/Shanghai
      - LANG=en_US.UTF-8

# 应用
  aiserverconfig:
# 20882 11383
    hostname: aiserverconfig
    image: 10.10.3.5/cta/aiserverconfig-cta_1215_20220112_002:latest
    healthcheck:
      test: ["CMD-SHELL", "curl -sS 127.0.0.1:11383 || exit 1"]
      interval: 1m30s
      timeout: 10s
      retries: 3
      start_period: 40s
    depends_on:
      mysql:
        condition: service_healthy
      zk:
        condition: service_healthy
    volumes:
      - /etc/sign.conf:/etc/sign.conf
      - /data1/container-root/aiserverconfig/log:/root/aiserverconfig/log
# 增加input挂载
      - /data1/inputdata:/data1/inputdata
    container_name: aiserverconfig
    privileged: true
    network_mode: "host"

  aiserver:
# 20880 11381
    hostname: aiserver
    image: 10.10.3.5/cta/aiserver-cta_1215_20220112_002:latest
    healthcheck:
      test: ["CMD-SHELL", "curl -sS 127.0.0.1:11381/aiserver/ai/v1/echo || exit 1"]
      interval: 1m30s
      timeout: 10s
      retries: 3
      start_period: 40s
    depends_on:
      mysql:
        condition: service_healthy
      zk:
        condition: service_healthy
      aiserverconfig:
        condition: service_healthy
    volumes:
      - /etc/sign.conf:/etc/sign.conf
      - /data1/container-root/aiserver/log:/root/aiserver/log
# 增加input挂载
      - /data1/inputdata:/data1/inputdata
    container_name: aiserver
    privileged: true
    network_mode: "host"

  pacsserver:
# 20881 22222 11380
    hostname: pacsserver
    image: 10.10.3.5/cta/pacsserver-cta_1215_20220112_002:latest
    healthcheck:
      test: ["CMD-SHELL", "curl -sS 127.0.0.1:11384/pacs/v2/dicom/echo || exit 1"]
      interval: 1m30s
      timeout: 10s
      retries: 3
      start_period: 40s
    depends_on:
      mysql:
        condition: service_healthy
      zk:
        condition: service_healthy
      aiserverconfig:
        condition: service_healthy
      aiserver:
        condition: service_healthy
    volumes:
      - /etc/sign.conf:/etc/sign.conf
      - /data1/container-root/pacsserver/log:/root/pacsserver/log
# 增加input挂载
      - /data1/inputdata:/data1/inputdata
    container_name: pacsserver
    privileged: true
    network_mode: "host"

  platform:
# 11380 11345
    hostname: platform
    image: 10.10.3.5/cta/platform-cta_1215_20220112_002:latest
    healthcheck:
      test: ["CMD-SHELL", "curl -sS 127.0.0.1:11380/echo || exit 1"]
      interval: 1m30s
      timeout: 10s
      retries: 3
      start_period: 40s
    depends_on:
      mysql:
        condition: service_healthy
      zk:
        condition: service_healthy
      aiserverconfig:
        condition: service_healthy
      aiserver:
        condition: service_healthy
    volumes:
      - /etc/sign.conf:/etc/sign.conf
      - /data1/container-root/platform/log:/root/platform/log
# 增加input挂载
      - /data1/inputdata:/data1/inputdata
    container_name: platform
    privileged: true
    network_mode: "host"

  ocrsvr:
# 28800
    hostname: ocrsvr
    image: 10.10.3.5/cta/ocrsvr-cta_1215_20220112_002:latest
    depends_on:
      mysql:
        condition: service_healthy
      zk:
        condition: service_healthy
      aiserverconfig:
        condition: service_healthy
      aiserver:
        condition: service_healthy
    volumes:
      - /etc/sign.conf:/etc/sign.conf
      - /data1/container-root/ocrsvr/log:/root/ocrsvr/log
# 增加input挂载
      - /data1/inputdata:/data1/inputdata
    container_name: ocrsvr
    privileged: true
    network_mode: "host"

  lung:
# 20880 11381
    hostname: lung
    image: 10.10.3.5/cta/lung-cta_1215_20220112_002:latest
    depends_on:
      mysql:
        condition: service_healthy
      zk:
        condition: service_healthy
      aiserverconfig:
        condition: service_healthy
      aiserver:
        condition: service_healthy
    volumes:
      - /etc/sign.conf:/etc/sign.conf
      - /data1/container-root/lung/log:/root/lung/log
# 增加input挂载
      - /data1/inputdata:/data1/inputdata
      - /tmp/.X11-unix:/tmp/.X11-unix
    container_name: lung
    privileged: true
    network_mode: "host"
    environment:
      - NVIDIA_DRIVER_CAPABILITIES=all
      - DISPLAY
      - XAUTHORITY
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]

二、Dockerfile方式

假设我们有个镜像是个最简单的 Web 服务,我们希望增加健康检查来判断其 Web 服务是否在正常工作,我们可以用 curl 来帮助判断,其 DockerfileHEALTHCHECK 可以这么写:

Dockerfile

FROM elasticsearch:5.5

HEALTHCHECK --interval=5s --timeout=2s --retries=12 \
  CMD curl --silent --fail localhost:9200/_cluster/health || exit 1
docker build -t test/elasticsearch:5.5 .

docker run --rm -d \
    --name=elasticsearch \
    test/elasticsearch:5.5

我们可以通过 docker ps,来发现过了几秒之后,Elasticsearch容器从 starting 状态进入了 healthy 状态

#!/bin/bash
# 检测tomcat端口 细心的小伙伴可以在awk把最后一个:后面的端口取出来 会更准确
netstat -luntp |awk '{print $4}'  |grep 8080
if [ $? == 0 ]
then
    echo $?
    exit 0
else
    echo $?
    exit 1
fi

FROM registry.cn-shanghai.aliyuncs.com/yjk-datag/tomcat:v1
MAINTAINER YJK Enterprise Container Images <min@hz-health.cn>
ENV LANG C.UTF-8
ENV PATH /usr/bin:$PATH
RUN    mv /srv/tomcat/tomcat8/  /srv/tomcat/tomcat-haozhuo-video
ADD ROOT.war  /srv/tomcat/tomcat-haozhuo-video/webapps/
ADD health_check.sh  /opt/
EXPOSE 8080 20920
HEALTHCHECK --start-period=60s  --interval=60s --timeout=5s --retries=3 CMD /bin/bash /opt/health_check.sh

# 依赖基础镜像centos7版jdk1.8


FROM openjdk:8
# 标签
LABEL maintainer="2022-12-23"
# 传输文件,将search里面的内容考入/opt/search/中
#COPY search /usr/CommandCenter/gis/search
#添加search.tar.gz压缩文件到/opt目录下,并同时完成解压,完成后的目录为opt/search/xxxx
ADD fps.tar.gz /usr/CommandCenter/vcs
# 给启动脚本授可执行权限
RUN chmod +x /usr/fps/bin/docker_startup.sh
RUN chmod +x /usr/fps/bin/get-nacos-status.sh
# 安装curl
RUN apk update && apk add curl && apk add busybox-extras
# 工作目录
WORKDIR /usr/CommandCenter
# 启动startup.sh
CMD ["/bin/sh","-c","/usr/bin/docker_startup.sh"]
#CMD ["/bin/sh","-c","ps&&tail -f /dev/null"]

三、docker run方式

另外一种方法是在 docker run 命令中,直接指明healthcheck相关策略

$ docker run --rm -d \
    --name=elasticsearch \
    --health-cmd="curl --silent --fail localhost:9200/_cluster/health || exit 1" \
    --health-interval=5s \
    --health-retries=12 \
    --health-timeout=2s \
    elasticsearch:5.5

四、查看检查日志

为了帮助排障,健康检查命令的输出(包括 stdout 以及 stderr)都会被存储于健康状态里,可以用 docker inspect 来查看。我们可以通过如下命令,来获取过去5个容器的健康检查结果

docker inspect --format='{{json .State.Health}}' 容器名

docker inspect --format='{{json .State.Health}}' commandcenter.public.configcenter
或者
docker inspect 容器名 | jq ".[].State.Health"

日志示例

{
  "Status": "healthy",
  "FailingStreak": 0,
  "Log": [
    {
      "Start": "2017-08-19T09:12:53.393598805Z",
      "End": "2017-08-19T09:12:53.452931792Z",
      "ExitCode": 0,
      "Output": "..."
    },
    ...
}

由于应用的开发者会更加了解应用的SLA,一般建议在Dockerfile中声明相应的健康检查策略,这样可以方便镜像的使用。对于应用的部署和运维人员,可以通过命令行参数和REST API针对部署场景对健康检查策略按需进行调整。文章来源地址https://www.toymoban.com/news/detail-613022.html

到了这里,关于docker中设置容器健康检查的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Docker容器:Docker-Compose

    一个Dockerfile模板文件可以定义一个单独的应用容器,如果需要定义多个容器就需要服务编排。服务编排有很多种技术方案,今天是介绍 Docker 官方产品 Docker Compose 。 docker swarm(管理跨节点)。 Dockerfile可以让用户管理一个单独的应用容器;而Compose则允许用户在一个模板(Y

    2024年02月11日
    浏览(39)
  • 云原生之深入解析Docker容器的health健康状态检查

    自 1.12 版本之后,Docker 引入了原生的健康检查实现。对于容器而言,最简单的健康检查是进程级的健康检查,即检验进程是否存活。Docker Daemon 会自动监控容器中的 PID1 进程,如果 docker run 命令中指明了 restart policy,可以根据策略自动重启已结束的容器。 在很多实际场景下,

    2024年02月09日
    浏览(51)
  • docker笔记9:Docker-compose容器编排

    目录 1.是什么? 2. 能干嘛? 3.去哪下? 4.安装步骤  ​编辑 5.卸载步骤   6.Compose核心概念  6.1概念 6.2 Compose常用命令   7.Compose编排微服务 7.1改造升级微服务工程docker_boot 7.2不用Compose 7.2.1 单独的mysql容器实例 7.3 swagger测试 7.4上面成功了,有哪些问题? 7.5 使用Compose  7.5.1

    2024年02月09日
    浏览(49)
  • docker-compose 构建 Kafka 容器

    在终端中创建一个名为 kafka 的目录,并进入该目录: 创建一个名为 docker-compose-kafka.yml 的文件并打开它。将以下代码复制到文件中: 这份配置使用了 Docker Compose,定义了两个服务 Zookeeper 和 Kafka。 Zookeeper 服务定义: 使用 wurstmeister/zookeeper 镜像; 将容器的 2181 端口映射到宿

    2024年02月10日
    浏览(66)
  • 【docker-compose】解决容器时区问题

            容器内时间比服务器慢8小时         容器时区默认 UTC 0          docker-compose.yaml 中设置时区

    2024年02月12日
    浏览(40)
  • docker-compose容器编排使用详解+示例

    Docker-Compose是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。 Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启

    2023年04月22日
    浏览(44)
  • Docker容器与虚拟化技术:Docker-Compose

    目录 一、理论 1.Docker-Compose 二、实验 1. Docker Compose 安装部署 2.Docker Compose撰写nginx 镜像 3.Docker Compose撰写tomcat 镜像 三、问题 1.Docker Compose 和 Dockerfile 的区别 四、总结 (1)使用场景 使用一个Dockerfile模板文件可以定义一个单独的应用容器,如果需要定义多个容器就需要服务

    2024年02月12日
    浏览(51)
  • docker-compose 如何安排容器启动的顺序

    在使用docker-compose进行容器部署的时候,时常是需要对容器的启动顺序进行编排,比如在应用容器启动前,需要先启动数据库的容器。通过对官方文档的阅读,发现在docker-compose中,可以使用depends_on配合健康检查healthcheck来实现。 参考链接: https://docs.docker.com/compose/compose-fi

    2024年02月12日
    浏览(49)
  • 【云原生】Docker-compose单机容器集群编排

    Compose是单机编排容器集群或者是分布式服务容器的应用工具。通过Compose,可以使用YAML文件来配置应用程序的服务。然后,使用一个命令,就可以从配置中创建并启动所有服务。 Docker-Compose是一个容器编排工具。通过一个.yml或.yaml文件,将所有的容器的部署方法、文件映射、

    2024年02月09日
    浏览(57)
  • 【RabbitMQ】【Docker】基于docker-compose构建rabbitmq容器

    本文通过docker-compose构建一个单体的rabbtimq容器。 首先需要有docker和docker-compose环境,docker安装[1],docker-compose安装[2]。 通过下列命令确定docker、docker-compose是否安装成功。 docker-compose在/usr/local/bin里,我们就在/usr/local下构建一个docker-compose目录,里面再构建各级不同容器的目

    2024年04月25日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包