极速体验docker容器健康

本文目是体验docker容器的健康检查功能,以体验为主不涉及开发,与开发相关的内容会在后面的文章细说。

关于容器健康检查

考虑这样的情况:docker环境中,springboot应用的容器还在,但已无法提供服务(例如数据或文件被破坏,线程池等资源被耗尽等各种异常),此时需要一种方式快速得知这种状态。
此时容器健康检查(即HEALTHCHECK)就派上用场了,只要容器按照Docker的规则提供自身状态信息,就可以将容器健康信息以多种方式告知外界;

版本要求

docker官方文档说明,HEALTHCHECK功能从1.12版本开始提供,这里对docker社区版的版本号做个简介:

1.12版本是2016年07月28日发布的;

1.13.1 版本2017年02月08日发布的,此版本之后,docker的版本命名规则有了变化,改为"YY.MM"格式;

17.03.0-ce版本是2017年03月01日发布的,从此开始了"YY.MM"格式的版本命名;

今天实战的docker环境是19.03.2版本;

实战环境信息

操作系统:macOS Catalina 10.15

Docker:19.03.2

开始体验

在控制台输入以下命令,即可创建一个带有健康检查信息的容器:

docker run --rm \ --name=healthcheck \ -p 8080:8080 \ --health-cmd="curl --silent --fail localhost:8080/getstate || exit 1" \ --health-interval=15s \ --health-retries=10 \ --health-timeout=5s \ bolingcavalry/dockerhealthcheck:0.0.1-SNAPSHOT

上述命令中带有四个和健康检查相关的参数,这里解释一下:

参数名 作用
health-cmd   指定命令在容器内执行,用于检查容器健康状态  
health-interval   每次健康检查的间隔时间,默认30秒  
health-retries   假设该值为3,表示若连续三次检测的返回结果都是不健康,就判定该容器不健康,默认值为3  
health-timeout   超时时间,默认30秒  

关于health-cmd参数,最常用的是shell命令,例如本例中就是curl --silent --fail localhost:8080/getstate || exit 1,意思是向容器的8080端口发起http请求,如果http响应的code为200,整个shell的返回值就是0,此时被docker判定为容器健康,如果http响应code不是200,shell的返回值就是1,此时被docker判定为容器不健康;

再打开一个控制台窗口,执行docker ps查看容器状态,注意STATUS字段,可见刚创建容器的时候是health: starting状态,稍后会变为healthy状态:

(base) zhaoqindeMacBook-Pro:~ zhaoqin$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d86c11321cef bolingcavalry/dockerhealthcheck:0.0.1-SNAPSHOT "java -Xms1g -Xmx1g …" 13 seconds ago Up 12 seconds (health: starting) 8080/tcp healthcheck (base) zhaoqindeMacBook-Pro:~ zhaoqin$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d86c11321cef bolingcavalry/dockerhealthcheck:0.0.1-SNAPSHOT "java -Xms1g -Xmx1g …" 17 seconds ago Up 16 seconds (healthy) 8080/tcp healthcheck

本次实战的镜像提供了http接口localhost:8080/getstate,用于返回容器状态,每次被调用都会在控制台打印一行信息,容器日志如下:

2019-10-20 03:05:02.350 INFO 1 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' 2019-10-20 03:05:02.364 INFO 1 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 14 ms 2019-10-20 03:05:02.384 INFO 1 --- [nio-8080-exec-1] c.b.d.DockerhealthcheckApplication : step probe return success 2019-10-20 03:05:17.584 INFO 1 --- [nio-8080-exec-2] c.b.d.DockerhealthcheckApplication : step probe return success 2019-10-20 03:05:32.748 INFO 1 --- [nio-8080-exec-3] c.b.d.DockerhealthcheckApplication : step probe return success

可见容器自启动后,该接口每隔15秒就会调用一次;

模拟不健康状态

在前面的操作中我们知道,只要容器的http接口localhost:8080/getstate的返回码是200,容器就被判定为健康;

想看看不健康状态的样子,只要http接口localhost:8080/getstate的返回码不是200就行了;

此镜像提供了另一个接口来方便观察不健康状态,假设宿主机的IP地址是102.168.0.3,在浏览器输入192.168.0.3:8080/setstate?state=false,该接口调用完毕后,localhost:8080/getstate的返回码就从200变成了403;

再去看容器的控制台信息,这次内容有变化了,从step probe return success变成了step probe return fail,此时getstate接口的返回码是403:

2019-10-20 03:38:51.428 INFO 1 --- [nio-8080-exec-3] c.b.d.DockerhealthcheckApplication : step probe return success 2019-10-20 03:39:06.592 INFO 1 --- [nio-8080-exec-9] c.b.d.DockerhealthcheckApplication : step probe return fail 2019-10-20 03:39:21.757 INFO 1 --- [io-8080-exec-10] c.b.d.DockerhealthcheckApplication : step probe return fail 2019-10-20 03:39:36.912 INFO 1 --- [nio-8080-exec-3] c.b.d.DockerhealthcheckApplication : step probe return fail

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwpwg.html