Java應用在docker環(huán)境配置容器健康檢查是怎么樣的

Java應用在docker環(huán)境配置容器健康檢查是怎么樣的,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

創(chuàng)新互聯(lián)專注于企業(yè)全網整合營銷推廣、網站重做改版、北流網站定制設計、自適應品牌網站建設、H5場景定制、商城網站開發(fā)、集團公司官網建設、成都外貿網站制作、高端網站制作、響應式網頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為北流等各大城市提供網站開發(fā)制作服務。

今天就來給java應用的容器加入健康檢查,使應用的狀態(tài)隨時都可以被監(jiān)控和查看。

實戰(zhàn)環(huán)境信息

  1. 操作系統(tǒng):macOS Catalina 10.15

  2. Docker:19.03.2

java應用簡介

今天實戰(zhàn)的java應用,是用來模擬生產環(huán)境應用的,特點如下:

  1. 普通springboot應用,對外提供http服務,路徑:<font color="blue">/hello</font>

  2. springboot應用運行在docker容器,在容器的<font color="blue">/app/depend/</font>目錄下有名為<font color="blue">abc.txt</font>的文件;

  3. 上述abc.txt文件存在時,springboot應用的hello接口正常,若abc.txt不存在,springboot應用就不對外提供服務,相當于不健康狀態(tài)(以此來模擬應用出現異常);

源碼下載

如果您不想寫代碼,上述springboot應用的源碼可在GitHub下載到,地址和鏈接信息如下表所示: | 名稱 | 鏈接 | 備注| | :-------- | :----| :----| | 項目主頁| https://github.com/zq2599/blog_demos | 該項目在GitHub上的主頁 | | git倉庫地址(https)| https://github.com/zq2599/blog_demos.git | 該項目源碼的倉庫地址,https協(xié)議 | | git倉庫地址(ssh)| git@github.com:zq2599/blog_demos.git | 該項目源碼的倉庫地址,ssh協(xié)議 | </br>

這個git項目中有多個文件夾,本章的應用在<font color="blue">springboot-app-docker-health-check</font>文件夾下,如下圖紅框所示: Java應用在docker環(huán)境配置容器健康檢查是怎么樣的

步驟簡介

應用接入容器健康檢查的步驟如下:

  1. 將java應用制作成docker鏡像時需要基礎鏡像,因此先準備好基礎鏡像,將容器健康檢查的參數都配置在基礎鏡像中,包括提供容器健康信息的接口路徑,這里定為<font color="blue">/getstate</font>;

  2. 改造java應用,提供<font color="blue">/getstate</font>接口服務,根據業(yè)務的實際情況決定當前應用是否健康,健康時返回碼為200,不健康時返回碼為403;

  3. 編譯構建應用并且生成docker鏡像;

  4. 驗證;

制作基礎鏡像

  1. 創(chuàng)建名為<font color="blue">Dockerfile</font>的文件,內容如下:

# Docker file from bolingcavalry # VERSION 0.0.1
# Author: bolingcavalry

#基礎鏡像
FROM openjdk:8-jdk-stretch

#作者
MAINTAINER BolingCavalry <zq2599@gmail.com>

#健康檢查參數設置,每5秒檢查一次,接口超時時間2秒,連續(xù)10次返回1就判定該容器不健康
HEALTHCHECK --interval=5s --timeout=2s --retries=10 \
  CMD curl --silent --fail localhost:8080/getstate || exit 1

由上述可見Dockerfile的內容非常簡單,選定自身的基礎鏡像為<font color="blue">openjdk:8-jdk-stretch</font>,再配置好健康檢查參數: | 參數名 | 作用 | |--|--| | health-cmd | 指定命令在容器內執(zhí)行,用于檢查容器健康狀態(tài) | | health-interval | 每次健康檢查的間隔時間,默認30秒 | | health-retries | 假設該值為3,表示若連續(xù)三次檢測的返回結果都是不健康,就判定該容器不健康,默認值為3 | | health-timeout | 超時時間,默認30秒 | 2. 在Dockerfile文件所在目錄執(zhí)行命令<font color="blue">docker build -t bolingcavalry/jdk8-healthcheck:0.0.1 .</font>(最后那個點號不要漏掉),控制臺輸出如下,提示鏡像構建成功:

(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
  1. 此時宿主機上已經有了名為<font color="blue">bolingcavalry/jdk8-healthcheck:0.0.1</font>的鏡像,該鏡像帶有容器健康檢查的參數配置,以此作為基礎鏡像來構建的其他鏡像都集成了健康檢查的特性;

  2. 如果您已經在hub.docker.com上注冊過,就可以用<font color="blue">docker login</font>命令登錄,然后執(zhí)行以下命令將本地鏡像推送到hub.docker.com給更多人使用:

docker push bolingcavalry/jdk8-healthcheck:0.0.1

改造Java應用

本次實戰(zhàn)的目標是讓Java應用支持docker的容器健康檢查功能,接下來一起創(chuàng)建這個Java應用:

  1. 這是個基于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節(jié)點用來設置鏡像的基礎鏡像,相當于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>
                        <!--使用該參數將鏡像的創(chuàng)建時間與系統(tǒng)時間對其-->
                        <useCurrentTimestamp>true</useCurrentTimestamp>
                    </container>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

上述pom.xml有以下幾處需要注意: a. 使用jib插件來將當前工程構建成docker鏡像; b. 基礎鏡像是前面構建的<font color="blue">bolingcavalry/jdk8-healthcheck:0.0.1</font>,以此為基礎鏡像的鏡像都帶有健康檢查功能;

  1. 主要功能類是<font color="blue">SpringbootAppDockerHealthCheckApplication.java</font>:

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
@Slf4j
public 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<String> 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<String> 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<String> 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. <font color="blue">hello</font>方法是此應用對外提供的服務,如果本地文件abc.txt存在且內容不為空,hello方法的返回碼就是200,否則返回碼為403,表示當前服務出現異常; b. <font color="blue">getstate</font>方法是新增的服務,該接口會被docke-daemon調用,如果返回碼是200,就表示容器健康,如果返回碼是403,表示容器不健康; 3. 在pom.xml文件所在目錄執(zhí)行<font color="blue">mvn clean compile -U -DskipTests jib:dockerBuild</font>,即可將當前工程構建為鏡像,名為<font color="blue">bolingcavalry/springboot-app-docker-health-check:0.0.1-SNAPSHOT</font> 4. 至此,支持容器健康檢查的Java應用鏡像構建成功,接下來驗證容器的健康檢查功能是否正常;

驗證步驟

驗證的步驟如下: a. 讓應用容器正常工作,確保文件<font color="blue">/app/depend/abc.txt</font>是正常的,此時容器狀態(tài)應該是<font color="red">healthy</font> b. 將文件<font color="blue">/app/depend/abc.txt</font>刪除,此時應用hello接口返回碼為403,并且容器狀態(tài)變?yōu)?lt;font color="red">unhealthy</font>

驗證操作

  1. 創(chuàng)建文件<font color="blue">abc.txt</font>,完整路徑是<font color="blue">/Users/zhaoqin/temp/201910/20/abc.txt</font>,文件內容是個字符串,例如:123456

  2. 執(zhí)行以下命令,用新建的java應用鏡像創(chuàng)建容器,該容器會將<font color="blue">test</font>文件夾映射到容器的<font color="blue">/app/depend</font>文件夾:

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 ms
2019-10-20 14:16:34.959  INFO 1 --- [nio-8080-exec-1] pringbootAppDockerHealthCheckApplication : service is healthy
2019-10-20 14:16:40.159  INFO 1 --- [nio-8080-exec-2] pringbootAppDockerHealthCheckApplication : service is healthy
2019-10-20 14:16:45.356  INFO 1 --- [nio-8080-exec-4] pringbootAppDockerHealthCheckApplication : service is healthy
2019-10-20 14:16:50.580  INFO 1 --- [nio-8080-exec-6] pringbootAppDockerHealthCheckApplication : service is healthy
  1. 執(zhí)行命令<font color="blue">docker ps</font>查看容器狀態(tài),可見已經是<font color="red">healthy</font>:

(base) zhaoqindeMBP:20 zhaoqin$ docker ps
CONTAINER ID        IMAGE                                                             COMMAND                  CREATED              STATUS                        PORTS                    NAMES
51572d2488fb        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. 刪除宿主機上的<font color="blue">/Users/zhaoqin/temp/201910/20/abc.txt</font>,相當于容器內的abc.txt文件被刪除,此時控制臺可見健康檢查接口在被調用時發(fā)現文件不存在,已返回了403錯誤碼:

019-10-20 14:22:37.490 ERROR 1 --- [nio-8080-exec-7] pringbootAppDockerHealthCheckApplication : service is unhealthy
  1. 健康檢查接口被連續(xù)10次調用后,再執(zhí)行命令<font color="blue">docker ps</font>查看容器狀態(tài),可見已經是<font color="red">unhealthy</font>:

(base) zhaoqindeMBP:20 zhaoqin$ docker ps
CONTAINER ID        IMAGE                                                             COMMAND                  CREATED             STATUS                     PORTS                    NAMES
51572d2488fb        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環(huán)境配置容器健康檢查是怎么樣的問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關知識。

當前文章:Java應用在docker環(huán)境配置容器健康檢查是怎么樣的
文章出自:http://muchs.cn/article24/pishce.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供面包屑導航、微信公眾號、關鍵詞優(yōu)化軟件開發(fā)、網站建設、用戶體驗

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

綿陽服務器托管