Java 应用在 docker 环境配置容器健康检查
欢迎访问我的 GitHub
这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
在《极速体验docker容器健康》一文已体验了 docker 容器健康检查功能,今天就来给 java 应用的容器加入健康检查,使应用的状态随时都可以被监控和查看。
实战环境信息
操作系统:macOS Catalina 10.15
Docker:19.03.2
java 应用简介
今天实战的 java 应用,是用来模拟生产环境应用的,特点如下:
普通 springboot 应用,对外提供 http 服务,路径: /hello
springboot 应用运行在 docker 容器,在容器的 /app/depend/ 目录下有名为 abc.txt 的文件;
上述 abc.txt 文件存在时,springboot 应用的 hello 接口正常,若 abc.txt 不存在,springboot 应用就不对外提供服务,相当于不健康状态(以此来模拟应用出现异常);
源码下载
如果您不想写代码,上述 springboot 应用的源码可在 GitHub 下载到,地址和链接信息如下表所示:
这个 git 项目中有多个文件夹,本章的应用在 springboot-app-docker-health-check 文件夹下,如下图红框所示:
步骤简介
应用接入容器健康检查的步骤如下:
将 java 应用制作成 docker 镜像时需要基础镜像,因此先准备好基础镜像,将容器健康检查的参数都配置在基础镜像中,包括提供容器健康信息的接口路径,这里定为 /getstate ;
改造 java 应用,提供 /getstate 接口服务,根据业务的实际情况决定当前应用是否健康,健康时返回码为 200,不健康时返回码为 403;
编译构建应用并且生成 docker 镜像;
验证;
制作基础镜像
创建名为 Dockerfile 的文件,内容如下:
由上述可见 Dockerfile 的内容非常简单,选定自身的基础镜像为 openjdk:8-jdk-stretch ,再配置好健康检查参数:
在 Dockerfile 文件所在目录执行命令 docker build -t bolingcavalry/jdk8-healthcheck:0.0.1 . (最后那个点号不要漏掉),控制台输出如下,提示镜像构建成功:
此时宿主机上已经有了名为 bolingcavalry/jdk8-healthcheck:0.0.1 的镜像,该镜像带有容器健康检查的参数配置,以此作为基础镜像来构建的其他镜像都集成了健康检查的特性;
如果您已经在 hub.docker.com 上注册过,就可以用 docker login 命令登录,然后执行以下命令将本地镜像推送到 hub.docker.com 给更多人使用:
改造 Java 应用
本次实战的目标是让 Java 应用支持 docker 的容器健康检查功能,接下来一起创建这个 Java 应用:
这是个基于 maven 构建的 springboot 工程,pom.xml 内容如下:
上述 pom.xml 有以下几处需要注意:a. 使用 jib 插件来将当前工程构建成 docker 镜像;b. 基础镜像是前面构建的 bolingcavalry/jdk8-healthcheck:0.0.1 ,以此为基础镜像的镜像都带有健康检查功能;
主要功能类是 SpringbootAppDockerHealthCheckApplication.java :
上述代码有以下几处需要注意:a. hello 方法是此应用对外提供的服务,如果本地文件 abc.txt 存在且内容不为空,hello 方法的返回码就是 200,否则返回码为 403,表示当前服务出现异常;b. getstate 方法是新增的服务,该接口会被 docke-daemon 调用,如果返回码是 200,就表示容器健康,如果返回码是 403,表示容器不健康;
在 pom.xml 文件所在目录执行 mvn clean compile -U -DskipTests jib:dockerBuild ,即可将当前工程构建为镜像,名为 bolingcavalry/springboot-app-docker-health-check:0.0.1-SNAPSHOT
至此,支持容器健康检查的 Java 应用镜像构建成功,接下来验证容器的健康检查功能是否正常;
验证步骤
验证的步骤如下:a. 让应用容器正常工作,确保文件 /app/depend/abc.txt 是正常的,此时容器状态应该是 healthyb. 将文件 /app/depend/abc.txt 删除,此时应用 hello 接口返回码为 403,并且容器状态变为 unhealthy
验证操作
创建文件 abc.txt ,完整路径是 /Users/zhaoqin/temp/201910/20/abc.txt ,文件内容是个字符串,例如:123456
执行以下命令,用新建的 java 应用镜像创建容器,该容器会将 test 文件夹映射到容器的 /app/depend 文件夹:
控制台可见以下输出,表明健康检查接口已经被调用:
执行命令 docker ps 查看容器状态,可见已经是 healthy :
删除宿主机上的 /Users/zhaoqin/temp/201910/20/abc.txt ,相当于容器内的 abc.txt 文件被删除,此时控制台可见健康检查接口在被调用时发现文件不存在,已返回了 403 错误码:
健康检查接口被连续 10 次调用后,再执行命令 docker ps 查看容器状态,可见已经是 unhealthy :
至此,Java 应用在 docker 环境配置容器健康检查的实战就完成了,希望您在给自己的应用添加健康检查时,此文能给您一些参考。
欢迎关注 InfoQ:程序员欣宸
版权声明: 本文为 InfoQ 作者【程序员欣宸】的原创文章。
原文链接:【http://xie.infoq.cn/article/2bb3264eb0401fd654521015c】。文章转载请联系作者。
评论