千家信息网

Java应用在docker环境配置容器健康检查是怎么样的

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,Java应用在docker环境配置容器健康检查是怎么样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。今天就来给java应用的容器加
千家信息网最后更新 2026年11月03日Java应用在docker环境配置容器健康检查是怎么样的

Java应用在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下载到,地址和链接信息如下表所示: | 名称 | 链接 | 备注| | :-------- | :----| :----| | 项目主页| 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文件夹下,如下图红框所示:

步骤简介

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

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

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

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

  4. 验证;

制作基础镜像

  1. 创建名为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,再配置好健康检查参数: | 参数名 | 作用 | |--|--| | health-cmd | 指定命令在容器内执行,用于检查容器健康状态 | | health-interval | 每次健康检查的间隔时间,默认30秒 | | health-retries | 假设该值为3,表示若连续三次检测的返回结果都是不健康,就判定该容器不健康,默认值为3 | | health-timeout | 超时时间,默认30秒 | 2. 在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
  1. 此时宿主机上已经有了名为bolingcavalry/jdk8-healthcheck:0.0.1的镜像,该镜像带有容器健康检查的参数配置,以此作为基础镜像来构建的其他镜像都集成了健康检查的特性;

  2. 如果您已经在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内容如下:

    4.0.0            org.springframework.boot        spring-boot-starter-parent        2.2.0.RELEASE                 com.bolingcavalry    springboot-app-docker-health-check    0.0.1-SNAPSHOT    springboot-app-docker-health-check    Demo project for Spring Boot            1.8                            org.springframework.boot            spring-boot-starter-web                          org.projectlombok          lombok          true                            commons-io            commons-io            2.5                            org.springframework.boot            spring-boot-starter-test            test                                                org.junit.vintage                    junit-vintage-engine                                                                                org.springframework.boot                spring-boot-maven-plugin                                                    com.google.cloud.tools                jib-maven-plugin                1.7.0                                                                                                        bolingcavalry/jdk8-healthcheck:0.0.1                                                                                        bolingcavalry/${project.artifactId}:${project.version}                                                                                                                                        -Xms1g                            -Xmx1g                                                                                                    8080                                                                        true                                                            

上述pom.xml有以下几处需要注意: a. 使用jib插件来将当前工程构建成docker镜像; b. 基础镜像是前面构建的bolingcavalry/jdk8-healthcheck:0.0.1,以此为基础镜像的镜像都带有健康检查功能;

  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", e);        } catch (IOException e) {            log.error("io exception", e);        }        return content;    }    /**     * 对外提供的http服务,读取本地的txt文件将内容返回,     * 如果读取不到内容返回码为403     * @return     */    @RequestMapping(value = "/hello", method = RequestMethod.GET)    public ResponseEntity hello(){        String localFileContent = getLocalFileContent();        if(StringUtils.isEmpty(localFileContent)) {            log.error("hello service error");            return ResponseEntity.status(403).build();        } else {            log.info("hello service success");            return ResponseEntity.status(200).body(localFileContent);        }    }    /**     * 该http服务返回当前应用是否正常,     * 如果能从本地txt文件成功读取内容,当前应用就算正常,返回码为200,     * 如果无法从本地txt文件成功读取内容,当前应用就算异常,返回码为403     * @return     */    @RequestMapping(value = "/getstate", method = RequestMethod.GET)    public ResponseEntity getstate(){        String localFileContent = getLocalFileContent();        if(StringUtils.isEmpty(localFileContent)) {            log.error("service is unhealthy");            return ResponseEntity.status(403).build();        } else {            log.info("service is healthy");            return ResponseEntity.status(200).build();        }    }}

上述代码有以下几处需要注意: a. hello方法是此应用对外提供的服务,如果本地文件abc.txt存在且内容不为空,hello方法的返回码就是200,否则返回码为403,表示当前服务出现异常; b. getstate方法是新增的服务,该接口会被docke-daemon调用,如果返回码是200,就表示容器健康,如果返回码是403,表示容器不健康; 3. 在pom.xml文件所在目录执行mvn clean compile -U -DskipTests jib:dockerBuild,即可将当前工程构建为镜像,名为bolingcavalry/springboot-app-docker-health-check:0.0.1-SNAPSHOT 4. 至此,支持容器健康检查的Java应用镜像构建成功,接下来验证容器的健康检查功能是否正常;

验证步骤

验证的步骤如下: a. 让应用容器正常工作,确保文件/app/depend/abc.txt是正常的,此时容器状态应该是healthy b. 将文件/app/depend/abc.txt删除,此时应用hello接口返回码为403,并且容器状态变为unhealthy

验证操作

  1. 创建文件abc.txt,完整路径是/Users/zhaoqin/temp/201910/20/abc.txt,文件内容是个字符串,例如:123456

  2. 执行以下命令,用新建的java应用镜像创建容器,该容器会将test文件夹映射到容器的/app/depend文件夹:

docker run --rm \--name=java-health-check \-p 8080:8080 \-v /Users/zhaoqin/temp/201910/20:/app/depend \bolingcavalry/springboot-app-docker-health-check:0.0.1-SNAPSHOT
  1. 控制台可见以下输出,表明健康检查接口已经被调用:

2019-10-20 14:16:34.875  INFO 1 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'2019-10-20 14:16:34.876  INFO 1 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'2019-10-20 14:16:34.892  INFO 1 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 16 ms2019-10-20 14:16:34.959  INFO 1 --- [nio-8080-exec-1] pringbootAppDockerHealthCheckApplication : service is healthy2019-10-20 14:16:40.159  INFO 1 --- [nio-8080-exec-2] pringbootAppDockerHealthCheckApplication : service is healthy2019-10-20 14:16:45.356  INFO 1 --- [nio-8080-exec-4] pringbootAppDockerHealthCheckApplication : service is healthy2019-10-20 14:16:50.580  INFO 1 --- [nio-8080-exec-6] pringbootAppDockerHealthCheckApplication : service is healthy
  1. 执行命令docker ps查看容器状态,可见已经是healthy:

(base) zhaoqindeMBP:20 zhaoqin$ docker psCONTAINER ID        IMAGE                                                             COMMAND                  CREATED              STATUS                        PORTS                    NAMES51572d2488fb        bolingcavalry/springboot-app-docker-health-check:0.0.1-SNAPSHOT   "java -Xms1g -Xmx1g …"   About a minute ago   Up About a minute (healthy)   0.0.0.0:8080->8080/tcp   java-health-check
  1. 删除宿主机上的/Users/zhaoqin/temp/201910/20/abc.txt,相当于容器内的abc.txt文件被删除,此时控制台可见健康检查接口在被调用时发现文件不存在,已返回了403错误码:

019-10-20 14:22:37.490 ERROR 1 --- [nio-8080-exec-7] pringbootAppDockerHealthCheckApplication : service is unhealthy
  1. 健康检查接口被连续10次调用后,再执行命令docker ps查看容器状态,可见已经是unhealthy:

(base) zhaoqindeMBP:20 zhaoqin$ docker psCONTAINER ID        IMAGE                                                             COMMAND                  CREATED             STATUS                     PORTS                    NAMES51572d2488fb        bolingcavalry/springboot-app-docker-health-check:0.0.1-SNAPSHOT   "java -Xms1g -Xmx1g …"   7 minutes ago       Up 7 minutes (unhealthy)   0.0.0.0:8080->8080/tcp   java-health-check

关于Java应用在docker环境配置容器健康检查是怎么样的问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

应用 健康 容器 文件 镜像 检查 内容 基础 接口 服务 命令 状态 配置 参数 地址 项目 验证 环境 成功 仓库 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 什么是科技互联网 互联网科技公司华为 深圳恒合互联网络科技有限公司 科技服务与互联网 奇酷互联网科技 以房互联网科技 互联网科技股票 互联网金融科技创新 互联网科技论坛 互联网科技大会 农村开互联网科技讲堂 北京三清互联网科技 银川新华互联网科技职业技术培训学校图片 佳云科技和互联网广告 互联网科技产业特征 西安小鹰速贷互联网科技有限公司 翼展科技 首家互联网医院 21世纪互联网科技成就 陕西九四连强互联网科技有限公司 恒生互联网科技趋势 金融科技创新监管互联网金融 互联网科技英文 致骋互联网科技 伴你行互联网科技有限公司 湖北码尼互联网科技有限公司电话 注册互联网科技公司经营范围大全 开一家科技互联网公司需要多少钱 互联网保险科技创业 广州梦谷互联网科技有限公司领导 萌小萌互联网科技河南有限公司
0