Dockerfile中使用HEALTHCHECK的形式有两种:

  1、HEALTHCHECK [options] CMD command
  2、HEALTHCHECK NODE 意思是禁止从父镜像继承的HEALTHCHECK生效 
下面我们主要介绍第一种形式的应用: 
options的可设定参数:

  interval:间隔(s秒、m分钟、h小时),从容器运行起来开始计时interval秒(或者分钟小时)进行第一次健康检查,随后每间隔interval秒进行一次健康检查;还有一种特例请看timeout解析。

  --start-period=DURATION 启动时间, 默认 0s, 如果指定这个参数, 则必须大于 0s ;--start-period 为需要启动的容器提供了初始化的时间段, 在这个时间段内如果检查失败, 则不会记录失败次数。 如果在启动时间内成功执行了健康检查, 则容器将被视为已经启动, 如果在启动时间内再次出现检查失败, 则会记录失败次数。

  timeout:执行command需要时间,比如curl 一个地址,如果超过timeout秒则认为超时是错误的状态,此时每次健康检查的时间是timeout+interval秒。
  retries:连续检查retries次,如果结果都是失败状态,则认为这个容器是unhealth的

CMD关键字后面可以跟执行shell脚本的命令或者exec数组。CMD后面的命令执行完的返回值代表容器的运行状况,可能的值:0 health状态,1 unhealth状态,2 reserved状态,这个没细研究,用的也很少。 
注意:在Dockerfile中只能有一个HEALTHCHECK指令。如果您列出多个,则只有最后一个HEALTHCHECK将生效。

下面我们进行几个测试: 
我手里有一个nginx的镜像,我们以它为base镜像进行一些简单的测试,以下是我的Dockerfile和测试脚本。

通过Dockerfile可以预计,容器启动10s内HEALTCHECK的状态为starting,10s后为healthy状态。脚本是监听容器的80端口,存在返回0,不存在返回1。

执行1、docker build -t test_nginx:2生成镜像 
       2、docker run -d test_nginx:2 启动容器。 
  3、通过docker ps查看HEALTHCHECK的状态 

验证:10s内health状态为starting,10s后状态为healthy 
下面我们需要进到容器把nginx服务停掉,然后观察health的状态,预计变成unhealthy使用时间为30s(关于时间上不好展示,有兴趣的话可以自己去做测试)

登到容器先确认80端口存在,停掉nginx服务,80端口消失,查看容器health状态 

验证:关掉nginx服务后,脚本检测到80端口不存在,返回1,容器状态为unhealthy(应该是执行了三次这个脚本得到结果都是1才确认这个容器是不健康的)

关于上面变成unhealthy状态使用了30s的时间,认真看的同事可能会发现不应该是timeout+interval秒后变吗。我的command是执行一个脚本,很快就能得到结果,不存在timeout的情况,所以我设置timeout的意义并不大。 
如果我这样设置HEALTHCHECK –interval=10s –timeout=3s –retries=3 CMD curl http://192.168.30.5:5000/v2。可能会出现curl这个地址3秒内没响应则认为失败,然后再开始interval的时间进行下次检测。最后显示unhealthy的状态应该是39s。这就不做测试了。

下面分享一个指令,通过docker指令得到指定容器id的健康状态 
docker inspect –format ‘{{json .State.Health.Status}}’ 41f1414fab75

Dockerfile HEALTHCHECK健康检查的更多相关文章

  1. docker HealthCheck健康检查

    需求 最近遇到的问题:线上跑的一个 Node 镜像是在运行的,状态为 up ,但是访问报 502 ,重启镜像无效,重新拉了个镜像运行才恢复正常.于是想研究下如何从应用层面去检查容器的状态 为什么 do ...

  2. ASP.NET CORE在docker中的健康检查(healthcheck)

    在使用docker-compose的过程中,很多程序都提供了健康检查(healthcheck)的方法,通过健康检查,应用程序能够在确保其依赖的程序都已经启动的前提下启动,减少各种错误的发生,同时,合理 ...

  3. k8s健康检查(七)--技术流ken

    默认的健康检查 强大的自愈能力是 Kubernetes 这类容器编排引擎的一个重要特性.自愈的默认实现方式是自动重启发生故障的容器.除此之外,用户还可以利用 Liveness 和 Readiness ...

  4. docker 构建带健康检查的redis镜像

    =============================================== 2018/11/5_第1次修改                       ccb_warlock == ...

  5. k8s的Health Check(健康检查)

    强大的自愈能力是 Kubernetes 这类容器编排引擎的一个重要特性.自愈的默认实现方式是自动重启发生故障的容器.除此之外,用户还可以利用 Liveness 和 Readiness 探测机制设置更精 ...

  6. Java应用在docker环境配置容器健康检查

    在<极速体验docker容器健康>一文已体验了docker容器健康检查功能,今天就来给java应用的容器加入健康检查,使应用的状态随时都可以被监控和查看. 实战环境信息 操作系统:macO ...

  7. Dockerfile HEALTHCHECK详解

    Dockerfile中使用HEALTHCHECK的形式有两种: 1.HEALTHCHECK [options] CMD command(本次详细解释) 2.HEALTHCHECK NODE 意思是禁止 ...

  8. 为你的docker容器增加一个健康检查机制

    1.健康检查 在分布式系统中,经常需要利用健康检查机制来检查服务的可用性,防止其他服务调用时出现异常.自 1.12 版本之后,Docker 引入了原生的健康检查实现. 如何给Docke配置原生健康检查 ...

  9. linux运维、架构之路-K8s健康检查Health Check

    一.Health Check介绍         强大的自愈能力是k8s容器编排引擎一个重要特性,自愈能力的默认实现方式为自动重启发生故障的容器,另外还可以利用Liveness和Readiness探测 ...

随机推荐

  1. 浏览器渲染详细过程:重绘、重排和 composite 只是冰山一角

    https://juejin.im/entry/590801780ce46300617c89b8 渲染 这张很经典的图许多人都看过,其中的概念大家应该都很熟悉,也就是这么几个步骤:js修改dom结构或 ...

  2. 【luogu 5395】 【模板】第二类斯特林数·行

    code: #include <bits/stdc++.h> #define ll long long #define setIO(s) freopen(s".in", ...

  3. CLR Exception---E0434352

    什么是CLR Exception---E0434352 CLR异常是.NET应用程序生成的异常类型.异常被封装在从System.exception类派生的类中.它的异常代码是0xE0434352,代码 ...

  4. 再说js隐式转换

    再说js隐式转换 自己整理的一个整体规则如下: Date 默认 走 toString, 如果 toString 返回的是对象, 那么查看 valueOf 其他对象的转换, 默认走 valueOf, 但 ...

  5. xss、SQL测试用例小结

    xss测试用例小结: <script>alert("跨站")</script> (最常用)<img scr=javascript:alert(&quo ...

  6. DDL/DML/DCL区别

    DDL DDL的概述 DDL(Data Definition Language 数据定义语言)用于操作对象和对象的属性,这种对象包括数据库本身,以及数据库对象,像:表.视图等等,DDL对这些对象和属性 ...

  7. SpringCloud:搭建基于Gateway的微服务网关(一)

    1.需求 最近在尝试着写一个开放平台,于是先搭建网关. 作用:统一的请求入口,完成对请求的跟踪,限流(未做),鉴权,分发,封装响应 2.工作原理 2.1.请求 在开放平台中申请对接口的使用,申请通过后 ...

  8. [Beta]Scrum Meeting#10

    github 本次会议项目由PM召开,时间为5月15日晚上10点30分 时长15分钟 任务表格 人员 昨日工作 下一步工作 木鬼 撰写博客整理文档 撰写博客整理文档 swoip 为适应新功能调整布局前 ...

  9. SQL回顾

    数据库的本质是一种特殊的文件 数据库是由数据表组成的,数据表是真正存储数据的 数据库客户端-->SQL语句-->数据库服务器-->数据库文件 表与表之间存在关联的数据库称为关系型数据 ...

  10. Spring Boot-JPA、Hibernate、Spring data jpa之间的关系

    什么么是JPA? 全称Java Persistence API,可以通过注解或者XML描述[对象-关系表]之间的映射关系,并将实体对象持久化到数据库中. 为我们提供了: 1)ORM映射元数据:JPA支 ...