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

在《极速体验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下载到,地址和链接信息如下表所示:
| 名称 | 链接 | 备注|
| :-------- | :----| :----|
| 项目主页| 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项目中有多个文件夹,本章的应用在springboot-app-docker-health-check文件夹下,如下图红框所示:

在这里插入图片描述

步骤简介

应用接入容器健康检查的步骤如下:

将java应用制作成docker镜像时需要基础镜像,因此先准备好基础镜像,将容器健康检查的参数都配置在基础镜像中,包括提供容器健康信息的接口路径,这里定为/getstate;

改造java应用,提供/getstate接口服务,根据业务的实际情况决定当前应用是否健康,健康时返回码为200,不健康时返回码为403;

编译构建应用并且生成docker镜像;

验证;

制作基础镜像

创建名为Dockerfile的文件,内容如下:

# Docker file from bolingcavalry # VERSION 0.0.1 # Author: bolingcavalry #基础镜像 FROM openjdk:8-jdk-stretch #作者 MAINTAINER BolingCavalry <zq2599@gmail.com> #健康检查参数设置,每5秒检查一次,接口超时时间2秒,连续10次返回1就判定该容器不健康 HEALTHCHECK --interval=5s --timeout=2s --retries=10 \ CMD curl --silent --fail localhost:8080/getstate || exit 1

由上述可见Dockerfile的内容非常简单,选定自身的基础镜像为openjdk:8-jdk-stretch,再配置好健康检查参数:
| 参数名 | 作用 |
|--|--|
| health-cmd | 指定命令在容器内执行,用于检查容器健康状态 |
| health-interval | 每次健康检查的间隔时间,默认30秒 |
| health-retries | 假设该值为3,表示若连续三次检测的返回结果都是不健康,就判定该容器不健康,默认值为3 |
| health-timeout | 超时时间,默认30秒 |

在Dockerfile文件所在目录执行命令docker build -t bolingcavalry/jdk8-healthcheck:0.0.1 .(最后那个点号不要漏掉),控制台输出如下,提示镜像构建成功:

(base) zhaoqindeMacBook-Pro:springboot-app-docker-health-check zhaoqin$ docker build -t bolingcavalry/jdk8-healthcheck:0.0.1 . Sending build context to Docker daemon 217.6kB Step 1/3 : FROM openjdk:8-jdk-stretch 8-jdk-stretch: Pulling from library/openjdk 9a0b0ce99936: Already exists db3b6004c61a: Already exists f8f075920295: Already exists 6ef14aff1139: Already exists 962785d3b7f9: Already exists 631589572f9b: Already exists c55a0c6f4c7b: Already exists Digest: sha256:8bce852e5ccd41b17bf9704c0047f962f891bdde3e401678a52d14a628defa49 Status: Downloaded newer image for openjdk:8-jdk-stretch ---> 57c2c2d2643d Step 2/3 : MAINTAINER BolingCavalry <zq2599@gmail.com> ---> Running in 270f78efa617 Removing intermediate container 270f78efa617 ---> 01b5df83611d Step 3/3 : HEALTHCHECK --interval=5s --timeout=2s --retries=10 CMD curl --silent --fail localhost:8080/getstate || exit 1 ---> Running in 7cdd08b9ca22 Removing intermediate container 7cdd08b9ca22 ---> 9dd7ffb22df4 Successfully built 9dd7ffb22df4 Successfully tagged bolingcavalry/jdk8-healthcheck:0.0.1

此时宿主机上已经有了名为bolingcavalry/jdk8-healthcheck:0.0.1的镜像,该镜像带有容器健康检查的参数配置,以此作为基础镜像来构建的其他镜像都集成了健康检查的特性;

如果您已经在hub.docker.com上注册过,就可以用docker login命令登录,然后执行以下命令将本地镜像推送到hub.docker.com给更多人使用:

docker push bolingcavalry/jdk8-healthcheck:0.0.1 改造Java应用

本次实战的目标是让Java应用支持docker的容器健康检查功能,接下来一起创建这个Java应用:

这是个基于maven构建的springboot工程,pom.xml内容如下:

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.0.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.bolingcavalry</groupId> <artifactId>springboot-app-docker-health-check</artifactId> <version>0.0.1-SNAPSHOT</version> <name>springboot-app-docker-health-check</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.5</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <!--使用jib插件--> <plugin> <groupId>com.google.cloud.tools</groupId> <artifactId>jib-maven-plugin</artifactId> <version>1.7.0</version> <configuration> <!--from节点用来设置镜像的基础镜像,相当于Docerkfile中的FROM关键字--> <from> <!--基础镜像是bolingcavalry/jdk8-healthcheck:0.0.1,该镜像已配置了健康检查参数--> <image>bolingcavalry/jdk8-healthcheck:0.0.1</image> </from> <to> <!--镜像名称和tag,使用了mvn内置变量${project.version},表示当前工程的version--> <image>bolingcavalry/${project.artifactId}:${project.version}</image> </to> <!--容器相关的属性--> <container> <!--jvm内存参数--> <jvmFlags> <jvmFlag>-Xms1g</jvmFlag> <jvmFlag>-Xmx1g</jvmFlag> </jvmFlags> <!--要暴露的端口--> <ports> <port>8080</port> </ports> <!--使用该参数将镜像的创建时间与系统时间对其--> <useCurrentTimestamp>true</useCurrentTimestamp> </container> </configuration> </plugin> </plugins> </build> </project>

上述pom.xml有以下几处需要注意:

a. 使用jib插件来将当前工程构建成docker镜像;

b. 基础镜像是前面构建的bolingcavalry/jdk8-healthcheck:0.0.1,以此为基础镜像的镜像都带有健康检查功能;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyfxdw.html