docker容器HEALTHCHECK 健康检查

docker容器的健康检测是在编写dockerfile时,将检测机制写入到dockerfile中,基于此docerfile生成的镜像,在运行容器时会有健康检测的功能。

dockerfile中的格式:

  • HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令。
  • HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令。

HEALTHCHECK 指令是告诉 Docker引擎应该如何进行判断容器的状态是否正常,这是 Docker 1.12 引入的指令。

在没有 HEALTHCHECK 指令前,Docker 引擎只可以通过容器内主进程是否退出来判断容器是否状态异常。很多情况下这没问题,但是如果程序进入死锁状态,或者死循环状态,应用进程并不退出,但是该容器已经无法提供服务了。在 1.12 以前,Docker 不会检测到容器的这种状态,从而不会重新调度,导致可能会有部分容器已经无法提供服务了却还在接受用户请求。

而自 1.12 之后,Docker 提供了 HEALTHCHECK 指令,通过该指令指定一行命令,用这行命令来判断容器主进程的服务状态是否还正常,从而比较真实的反应容器实际状态。

当在一个镜像指定了 HEALTHCHECK 指令后,用其启动容器,初始状态会为 starting,在 HEALTHCHECK 指令检查成功后变为 healthy,如果连续一定次数失败,则会变为 unhealthy。

HEALTHCHECK 支持下列选项:

  • --interval=<间隔>:两次健康检查的间隔,默认为 30 秒;
  • --timeout=<时长>:健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认 30 秒;
  • --retries=<次数>:当连续失败指定次数后,则将容器状态视为 unhealthy,默认 3 次。

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

在 HEALTHCHECK [选项] CMD 后面的命令,格式和 ENTRYPOINT 一样,分为 shell 格式,和 exec 格式。命令的返回值决定了该次健康检查的成功与否:0:成功;1:失败;2:保留,不要使用这个值。

用法举例:

[[email protected] test]# cat Dockerfile      #Dockerfile文件如下
FROM nginx:latest
COPY test.txt /test.txt
HEALTHCHECK --interval=5s --timeout=3s CMD cat /test.txt || exit 1

这里我们设置了每 5 秒检查一次(这里为了试验所以间隔非常短,实际应该相对较长),如果健康检查命令超过 3 秒没响应就视为失败,并且使用CMD cat /test.txt || exit 1 作为健康检查命令。

构建镜像:

[[email protected] test]# docker build -t lzj:v6 .

启动一个容器:

[[email protected] test]# docker run -d --name web03 lzj:v6

当该容器运行后,就可以查看到该容器的运行状态,初始状态为(health: starting),当一次检测成功后,会转换为(healthy),如下:

如果健康检查连续失败超过了重试次数,状态就会变为 (unhealthy)。我这里进入容器将其CMD执行的查看test.txt文件删除掉,状态就会为unhealthy,如下:

为了帮助排障,健康检查命令的输出(包括 stdout 以及 stderr)都会被存储于健康状态里,可以用 docker inspect 来查看。

———————— 本文至此结束,感谢阅读 ————————

原文地址:https://blog.51cto.com/14154700/2464362

时间: 2024-07-30 19:41:53

docker容器HEALTHCHECK 健康检查的相关文章

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

=============================================== 2018/11/5_第1次修改                       ccb_warlock =============================================== 由于希望引入docker的健康检查,即对不健康容器的策略(如果容器进入 unhealthy 状态,它会停止容器并且重新启动一个新容器来取代它),故根据官方给出的脚本进行修改后构建出带健康检查的redis镜像.

Dockerfile HEALTHCHECK健康检查

Dockerfile中使用HEALTHCHECK的形式有两种: 1.HEALTHCHECK [options] CMD command 2.HEALTHCHECK NODE 意思是禁止从父镜像继承的HEALTHCHECK生效 下面我们主要介绍第一种形式的应用: options的可设定参数: interval:间隔(s秒.m分钟.h小时),从容器运行起来开始计时interval秒(或者分钟小时)进行第一次健康检查,随后每间隔interval秒进行一次健康检查:还有一种特例请看timeout解析.

docker HealthCheck健康检查

需求 最近遇到的问题:线上跑的一个 Node 镜像是在运行的,状态为 up ,但是访问报 502 ,重启镜像无效,重新拉了个镜像运行才恢复正常.于是想研究下如何从应用层面去检查容器的状态 为什么 docker ps STATUS 列显示容器的状态 [[email protected] ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1cfb357dd83f 9962e62376bc "/bin/sh -

docker容器从入门到实战0826

##docker容器安装和配置### #docker的git-hub网站(账号rshare,密rshare520):https://github.com/login #docker官网hub仓库(账号flyer520,密码rhsare520):https://hub.docker.com #docker官网文档和镜像:https://docs.docker.com/samples/centos/ #docker官网的容器网络配置:https://docs.docker.com/engine/us

docker容器从入门到实战0826(笔记整理)

##docker容器安装和配置### #docker的git-hub网站(账号rshare,密rshare520):https://github.com/login #docker官网hub仓库(账号flyer520,密码rhsare520):https://hub.docker.com #docker官网文档和镜像:https://docs.docker.com/samples/centos/ #docker官网的容器网络配置:https://docs.docker.com/engine/us

Docker容器之镜像管理、端口映射、容器互联

docker镜像的分层 ?Dockerfile 中的每个指令都会创建一个新的镜像层:?镜像层将会被缓存和复用:?当 Dockerfile 的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效:?某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效:?镜像层是不变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然包含该文件 docker镜像 是应用发布的标准格式可支撑一个docker容器的运行 docker镜像的创建方法 基于已有镜像创建基于本地

容器HEALTHCHECK指令对接ASP.NET Core健康检查能力

 写在前面 HealthCheck 不仅是对应用程序内运行情况.数据流通情况进行检查, 还包括应用程序对外部服务或依赖资源的健康检查. 健康检查通常是以暴露应用程序的HTTP端点的形式 实施,可用于配置健康探测的的场景有 : 容器或负载均衡时 探测应用的状态, 例如:容器探测到应用unhealthy可 终止后续的滚动部署或者重启容器:负载均衡器探测到实例healthyunt能将请求路由到健康的运行实例. 对应用程序种依赖的第三方服务进行健康探测,比如redis.database.外部服务接口 内

Docker 健康检查功能

Docker1.12及以上版本,自带了健康检查功能.通常情况下只能使用docker ps 来查看容器是否是up的状态,但是服务是否正常我们不可知,而健康检查功能,可以允许我们在容器中执行一些健康检查的命令,然后将容器的状态在"STATUS"中标识: [[email protected]]# docker ps CONTAINER ID        IMAGE                        COMMAND             CREATED             

有容云AppSoar容器健康检查与调度策略

近两年来,微服务架构和基于容器的虚拟化技术以迅雷不及掩耳之势席卷了整个软件开发社区,微服务与Docker的结合更被视为一种"颠覆".在与容器结合使用后,微服务架构的优点得到了进一步的放大:微服务鼓励软件开发者将整个软件解耦为较小的功能模块,并且这些功能能够应对外界的故障:而容器进一步对这种解耦性进行了扩展,它能够将软件从底层的硬件中分离出来. 这种方式所产生的结果是:应用程序能够更快地进行创建,并且更易于维护,同时又能够得到更高的质量,从而促使越来越多的产业应用容器化.如eBay.Am