写点什么

极速体验 docker 容器健康,高并发分布式系统架构

用户头像
极客good
关注
发布于: 刚刚

考虑这样的情况: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. 在控制台输入以下命令,即可创建一个带有健康检查信息的容器:


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 状态:


(base) zhaoqindeMacBook-Pro:~ zhaoqin$ docker ps


CONTAINER ID IMAGE


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


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,用于返回容器状态,每次被调用都会在控制台打印一行信息,容器日志如下:


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;

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
极速体验docker容器健康,高并发分布式系统架构