前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >极速体验docker容器健康

极速体验docker容器健康

作者头像
程序员欣宸
发布2019-10-22 14:14:29
8200
发布2019-10-22 14:14:29
举报
文章被收录于专栏:实战docker

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/boling_cavalry/article/details/102641942

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

关于容器健康检查

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

版本要求

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

  1. 1.12版本是2016年07月28日发布的;
  2. 1.13.1 版本2017年02月08日发布的,此版本之后,docker的版本命名规则有了变化,改为"YY.MM"格式;
  3. 17.03.0-ce版本是2017年03月01日发布的,从此开始了"YY.MM"格式的版本命名;
  4. 今天实战的docker环境是19.03.2版本;

实战环境信息

  1. 操作系统:macOS Catalina 10.15
  2. Docker:19.03.2

开始体验

  1. 在控制台输入以下命令,即可创建一个带有健康检查信息的容器:
代码语言:javascript
复制
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
  1. 上述命令中带有四个和健康检查相关的参数,这里解释一下:

参数名

作用

health-cmd

指定命令在容器内执行,用于检查容器健康状态

health-interval

每次健康检查的间隔时间,默认30秒

health-retries

假设该值为3,表示若连续三次检测的返回结果都是不健康,就判定该容器不健康,默认值为3

health-timeout

超时时间,默认30秒

  1. 关于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判定为容器不健康;
  2. 再打开一个控制台窗口,执行docker ps查看容器状态,注意STATUS字段,可见刚创建容器的时候是health: starting状态,稍后会变为healthy状态:
代码语言:javascript
复制
(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
  1. 本次实战的镜像提供了http接口localhost:8080/getstate,用于返回容器状态,每次被调用都会在控制台打印一行信息,容器日志如下:
代码语言:javascript
复制
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秒就会调用一次;

模拟不健康状态

  1. 在前面的操作中我们知道,只要容器的http接口localhost:8080/getstate的返回码是200,容器就被判定为健康;
  2. 想看看不健康状态的样子,只要http接口localhost:8080/getstate的返回码不是200就行了;
  3. 此镜像提供了另一个接口来方便观察不健康状态,假设宿主机的IP地址是102.168.0.3,在浏览器输入192.168.0.3:8080/setstate?state=false,该接口调用完毕后,localhost:8080/getstate的返回码就从200变成了403;
  4. 再去看容器的控制台信息,这次内容有变化了,从step probe return success变成了step probe return fail,此时getstate接口的返回码是403:
代码语言:javascript
复制
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
  1. 前面在创建容器时的health-retries参数的值是10,意味着localhost:8080/getstate连续10次返回码非200才会被判定为不健康,因此,在控制台连续十次输出step probe return fail之前,执行docker ps命令观察容器状态,应该还是healthy,超过十次step probe return fail输出之后,再去看容器状态,就变成了unhealthy:
代码语言:javascript
复制
(base) zhaoqindeMacBook-Pro:~ zhaoqin$ docker ps
CONTAINER ID        IMAGE                                            COMMAND                  CREATED             STATUS                      PORTS                    NAMES
070e56cc99f2        bolingcavalry/dockerhealthcheck:0.0.1-SNAPSHOT   "java -Xms1g -Xmx1g …"   18 minutes ago      Up 18 minutes (unhealthy)   0.0.0.0:8080->8080/tcp   healthcheck
  1. 恢复健康状态:在浏览器输入192.168.0.3:8080/setstate?state=true,这样localhost:8080/getstate接口的返回码又变成了200,观察控制台,只要"step probe return success"输出一次,容器健康状态就恢复为healthy了;

观察容器事件

  1. 在控制台输入docker events --filter event=health_status,即可观察宿主机上所有的容器健康状态事件;
  2. 按照上面的操作,在浏览器输入192.168.0.3:8080/setstate?state=true或者192.168.0.3:8080/setstate?state=false,将容器的健康状态转变几次,可以观察到容器事件变化:
代码语言:javascript
复制
(base) zhaoqindeMacBook-Pro:~ zhaoqin$ docker events --filter event=health_status
2019-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下载,地址和链接信息如下表所示:

名称

链接

备注

项目主页

https://github.com/zq2599/blog_demos

该项目在GitHub上的主页

git仓库地址(https)

https://github.com/zq2599/blog_demos.git

该项目源码的仓库地址,https协议

git仓库地址(ssh)

git@github.com:zq2599/blog_demos.git

该项目源码的仓库地址,ssh协议

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

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/10/19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 关于容器健康检查
  • 版本要求
  • 实战环境信息
  • 开始体验
  • 模拟不健康状态
  • 观察容器事件
  • demo源码下载
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档