写点什么

极速体验 docker 容器健康

作者:程序员欣宸
  • 2022-11-03
    四川
  • 本文字数:3172 字

    阅读完需:约 10 分钟

极速体验docker容器健康

欢迎访问我的 GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos


  • 本文目是体验 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 参数,最常用的是 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 psCONTAINER ID        IMAGE                                            COMMAND                  CREATED             STATUS                             PORTS               NAMESd86c11321cef        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 psCONTAINER ID        IMAGE                                            COMMAND                  CREATED             STATUS                    PORTS               NAMESd86c11321cef        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 ms2019-10-20 03:05:02.384  INFO 1 --- [nio-8080-exec-1] c.b.d.DockerhealthcheckApplication       : step probe return success2019-10-20 03:05:17.584  INFO 1 --- [nio-8080-exec-2] c.b.d.DockerhealthcheckApplication       : step probe return success2019-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 success2019-10-20 03:39:06.592  INFO 1 --- [nio-8080-exec-9] c.b.d.DockerhealthcheckApplication       : step probe return fail2019-10-20 03:39:21.757  INFO 1 --- [io-8080-exec-10] c.b.d.DockerhealthcheckApplication       : step probe return fail2019-10-20 03:39:36.912  INFO 1 --- [nio-8080-exec-3] c.b.d.DockerhealthcheckApplication       : step probe return fail
复制代码


  • 前面在创建容器时的 health-retries 参数的值是 10,意味着 localhost:8080/getstate 连续 10 次返回码非 200 才会被判定为不健康,因此,在控制台连续十次输出 step probe return fail 之前,执行 docker ps 命令观察容器状态,应该还是 healthy ,超过十次 step probe return fail 输出之后,再去看容器状态,就变成了 unhealthy


(base) zhaoqindeMacBook-Pro:~ zhaoqin$ docker psCONTAINER ID        IMAGE                                            COMMAND                  CREATED             STATUS                      PORTS                    NAMES070e56cc99f2        bolingcavalry/dockerhealthcheck:0.0.1-SNAPSHOT   "java -Xms1g -Xmx1g …"   18 minutes ago      Up 18 minutes (unhealthy)   0.0.0.0:8080->8080/tcp   healthcheck
复制代码


  • 恢复健康状态:在浏览器输入 192.168.0.3:8080/setstate?state=true ,这样 localhost:8080/getstate 接口的返回码又变成了 200,观察控制台,只要"step probe return success"输出一次,容器健康状态就恢复为 healthy 了;

观察容器事件

  • 在控制台输入 docker events --filter event=health_status ,即可观察宿主机上所有的容器健康状态事件;

  • 按照上面的操作,在浏览器输入 192.168.0.3:8080/setstate?state=true 或者 192.168.0.3:8080/setstate?state=false ,将容器的健康状态转变几次,可以观察到容器事件变化:


(base) zhaoqindeMacBook-Pro:~ zhaoqin$ docker events --filter event=health_status2019-10-20T12:19:18.349588676+08:00 container health_status: unhealthy 2d538f8752ae1e94ce23f34b7fb71c8f2ea3a075df82943ffdbe62c49ad4d6c8 (image=bolingcavalry/dockerhealthcheck:0.0.1-SNAPSHOT, name=healthcheck)2019-10-20T12:20:19.030857534+08:00 container health_status: healthy 2d538f8752ae1e94ce23f34b7fb71c8f2ea3a075df82943ffdbe62c49ad4d6c8 (image=bolingcavalry/dockerhealthcheck:0.0.1-SNAPSHOT, name=healthcheck)
复制代码


  • 至此,docker 容器健康体验完毕,我们已经对此功能有了基本认识,接下来实战中,我们会尝试让自己的应用容器支持健康检查功能;

demo 源码下载

  • 本次实战的镜像来自一个 springboot 工程,可以直接从 GitHub 下载,地址和链接信息如下表所示:



  • 这个 git 项目中有多个文件夹,本章的应用在 dockerhealthcheck 文件夹下,如下图红框所示:


欢迎关注 InfoQ:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...


发布于: 2022-11-03阅读数: 53
用户头像

搜索"程序员欣宸",一起畅游Java宇宙 2018-04-19 加入

前腾讯、前阿里员工,从事Java后台工作,对Docker和Kubernetes充满热爱,所有文章均为作者原创,个人Github:https://github.com/zq2599/blog_demos

评论

发布
暂无评论
极速体验docker容器健康_容器化_程序员欣宸_InfoQ写作社区