本文目是体验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. 在控制台输入以下命令,即可创建一个带有健康检查信息的容器:
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 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;
  4. 再去看容器的控制台信息,这次内容有变化了,从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
  1. 前面在创建容器时的health-retries参数的值是10,意味着localhost:8080/getstate连续10次返回码非200才会被判定为不健康,因此,在控制台连续十次输出step probe return fail之前,执行docker ps命令观察容器状态,应该还是healthy,超过十次step probe return fail输出之后,再去看容器状态,就变成了healthy:
(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,将容器的健康状态转变几次,可以观察到容器事件变化:
(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容器健康体验完毕,我们已经对此功能有了基本认识,接下来实战中,我们会尝试让自己的应用容器支持健康检查功能;

本文由博客一文多发平台 OpenWrite 发布!

极速体验docker容器健康的更多相关文章

  1. Java应用在docker环境配置容器健康检查

    在<极速体验docker容器健康>一文已体验了docker容器健康检查功能,今天就来给java应用的容器加入健康检查,使应用的状态随时都可以被监控和查看. 实战环境信息 操作系统:macO ...

  2. 浅析Docker容器的应用场景

    本文来自网易云社区 作者:娄超 过去几年开源界以openstack为代表的云计算持续火了好久,这两年突然又冒出一个叫Docker的容器技术,其发展之迅猛远超预料.网上介绍Docker容器的文章已经很多 ...

  3. Docker下的Spring Cloud三部曲之一:极速体验

    版权声明:欢迎转载,请注明出处,谢谢. http://blog.csdn.net/boling_cavalry/article/details/79177930   目录(?)[+]   从本章开始, ...

  4. Docker下使用disconf:极速体验

    Docker下的disconf实战全文链接 <Docker搭建disconf环境,三部曲之一:极速搭建disconf>: <Docker搭建disconf环境,三部曲之二:本地快速构 ...

  5. Docker下kafka学习三部曲之一:极速体验kafka

    Kafka是一种高吞吐量的分布式发布订阅消息系统,从本章开始我们先极速体验,再实战docker下搭建kafka环境,最后开发一个java web应用来体验kafka服务. 我们一起用最快的速度体验ka ...

  6. Docker下实战zabbix三部曲之一:极速体验

    对于想学习和实践zabbix的读者来说,在真实环境搭建一套zabbix系统是件费时费力的事情,本文内容就是用docker来缩减搭建时间,目标是让读者们尽快投入zabbix系统的体验和实践: 环境信息 ...

  7. 一代版本一代神:利用Docker在Win10系统极速体验Django3.1真实异步(Async)任务

    一代版本一代神:利用Docker在Win10系统极速体验Django3.1真实异步(Async)任务 原文转载自「刘悦的技术博客」https://v3u.cn/a_id_177 就在去年(2019年) ...

  8. 微服务架构:基于微服务和Docker容器技术的PaaS云平台架构设计(微服务架构实施原理)

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 基于微服务架构和Docker容器技术的PaaS云平台建设目标是给我们的开发人员提供一套服务快速开发.部署.运维管理.持续开发持续集成的流程 ...

  9. Docker容器技术的PaaS云平台架构设计***

    基于微服务架构和Docker容器技术的PaaS云平台建设目标是给我们的开发人员提供一套服务快速开发.部署.运维管理.持续开发持续集成的流程.平台提供基础设施.中间件.数据服务.云服务器等资源,开发人员 ...

随机推荐

  1. 001-Zabbix 服务安装

    Zabbix 服务安装 [官方地址]点我快速打开文章 1.安装 Zabbix 1.1 下载 Zabbix 清华源 rpm -ivh https://mirrors.tuna.tsinghua.edu. ...

  2. 简单的深度神经网络实现——使用PyTorch

    使用的数据集是MNIST,预期可以达到98%左右的准确率. 该神经网络由一个输入层,一个全连接层结构的隐含层和一个输出层构建. 1.配置库和配置参数 import torch import torch ...

  3. JS高阶---变量与函数提升

    大纲: 主体: 案例1: 接下来在控制台source里进行断点测试 打好断点后,在控制台测试window .

  4. opencv估计两图的三维坐标变换矩阵

    cv::estimateAffine3D(MatFrom, MatTo, Transfrom, inlier); Transform得到的是重MatFrom到MatTo的变换矩阵.inlier给一个空 ...

  5. 【入门篇一】SpringBoot简介(1)

    官网:https://spring.io/projects/spring-boot 一.什么是SpringBoot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新S ...

  6. vue系列--- 认识Flow(一)

    1. 什么是Flow? Flow 是javascript代码的静态类型检查工具.它是Facebook的开源项目(https://github.com/facebook/flow),Vue.js(v2. ...

  7. nginx 403问题

    错误排查 https://blog.csdn.net/onlysunnyboy/article/details/75270533 关闭 SELinux https://blog.csdn.net/ed ...

  8. K12

    K12,教育类专用名词(kindergarten through twelfth grade),是学前教育至高中教育的缩写,现在普遍被用来代指基础教育. K-12教育是美国基础教育的统称.“K12”中 ...

  9. B1005 继续(3n+1)猜想 (25 分)

    一.技术总结 一个是注意输出格式,也就是末尾没有空格,这个解决方法一般是使用一个计数,然后打印输出一个就减少一个. 就是在使用数组时,要注意段错误,也就是数组开辟的是否够大. 如果可以的话,可以多设置 ...

  10. 一致性算法Raft

    参阅:https://www.cnblogs.com/xybaby/p/10124083.html 可视化:http://thesecretlivesofdata.com/raft/