docker image aarch64 x86_64_Java应用在docker环境配置容器健康检查

在《极速体验docker容器健康》一文已体验了docker容器健康检查功能,今天就来给java应用的容器加入健康检查,使应用的状态随时都可以被监控和查看。

实战环境信息

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

java应用简介

今天实战的java应用,是用来模拟生产环境应用的,特点如下:

  1. 普通springboot应用,对外提供http服务,路径/hello
  2. springboot应用运行在docker容器,在容器的/app/depend/目录下有名为abc.txt的文件;
  3. 上述abc.txt文件存在时,springboot应用的hello接口正常,若abc.txt不存在,springboot应用就不对外提供服务,相当于不健康状态(以此来模拟应用出现异常);

源码下载

如果您不想写代码,上述springboot应用的源码可在GitHub下载到,地址和链接信息如下表所示:

96829f26c3b85d9cc4ea805c8b04da30.png

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

1937fd43a191abb8cb8cd33ac131e38f.png

步骤简介

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

  1. 将java应用制作成docker镜像时需要基础镜像,因此先准备好基础镜像,将容器健康检查的参数都配置在基础镜像中,包括提供容器健康信息的接口路径,这里定为/getstate
  2. 改造java应用,提供/getstate接口服务,根据业务的实际情况决定当前应用是否健康,健康时返回码为200,不健康时返回码为403;
  3. 编译构建应用并且生成docker镜像;
  4. 验证;

制作基础镜像

  • 创建名为Dockerfile的文件,内容如下:
# Docker file from bolingcavalry # VERSION 0.0.1# Author: bolingcavalry#基础镜像FROM openjdk:8-jdk-stretch#作者MAINTAINER BolingCavalry #健康检查参数设置,每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,再配置好健康检查参数:

b2286bd8d597ced8ec37c35781da8a74.png
  • 在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.6kBStep 1/3 : FROM openjdk:8-jdk-stretch8-jdk-stretch: Pulling from library/openjdk9a0b0ce99936: Already existsdb3b6004c61a: Already existsf8f075920295: Already exists6ef14aff1139: Already exists962785d3b7f9: Already exists631589572f9b: Already existsc55a0c6f4c7b: Already existsDigest: sha256:8bce852e5ccd41b17bf9704c0047f962f891bdde3e401678a52d14a628defa49Status: Downloaded newer image for openjdk:8-jdk-stretch ---> 57c2c2d2643dStep 2/3 : MAINTAINER BolingCavalry  ---> Running in 270f78efa617Removing intermediate container 270f78efa617 ---> 01b5df83611dStep 3/3 : HEALTHCHECK --interval=5s --timeout=2s --retries=10 CMD curl --silent --fail localhost:8080/getstate || exit 1 ---> Running in 7cdd08b9ca22Removing intermediate container 7cdd08b9ca22 ---> 9dd7ffb22df4Successfully built 9dd7ffb22df4Successfully 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应用:

  1. 这是个基于maven构建的springboot工程,pom.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?>4.0.0org.springframework.boot spring-boot-starter-parent 2.2.0.RELEASEcom.bolingcavalry springboot-app-docker-health-check 0.0.1-SNAPSHOTspringboot-app-docker-health-checkDemo project for Spring Boot1.8org.springframework.boot spring-boot-starter-web org.projectlombok lombok truecommons-io commons-io 2.5org.springframework.boot spring-boot-starter-test testorg.junit.vintage junit-vintage-engine org.springframework.boot spring-boot-maven-plugin com.google.cloud.tools jib-maven-plugin 1.7.0bolingcavalry/jdk8-healthcheck:0.0.1bolingcavalry/${project.artifactId}:${project.version}-Xms1g-Xmx1g8080true

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

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

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

  • 主要功能类是SpringbootAppDockerHealthCheckApplication.java
package com.bolingcavalry.springbootappdockerhealthcheck;import lombok.extern.slf4j.Slf4j;import org.apache.commons.io.FileUtils;import org.apache.commons.io.IOUtils;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.http.ResponseEntity;import org.springframework.util.StringUtils;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RestController;import java.io.*;import java.util.List;@SpringBootApplication@RestController@Slf4jpublic class SpringbootAppDockerHealthCheckApplication { public static void main(String[] args) { SpringApplication.run(SpringbootAppDockerHealthCheckApplication.class, args); } /** * 读取本地文本文件的内容并返回 * @return */ private String getLocalFileContent() { String content = null; try{ InputStream is = new FileInputStream("/app/depend/abc.txt"); List lines = IOUtils.readLines(is, "UTF-8"); if(null!=lines && lines.size()>0){ content = lines.get(0); } } catch (FileNotFoundException e) { log.error("local file not found
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值