Bootstrap

docker-compose下的java应用启动顺序两部曲之二:实战

【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】

**开源地址:https://docs.qq.com/doc/DSmxTbFJ1cmN1R2dB **

| git仓库地址(https) | https://github.com/zq2599/blog_demos.git | 该项目源码的仓库地址,https协议 |

| git仓库地址(ssh) | [email protected]:zq2599/blog_demos.git | 该项目源码的仓库地址,ssh协议 |

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

在这里插入图片描述

源码的结构如下图所示:

在这里插入图片描述

接下来开始编码了;

简单介绍eureka和service容器

上一篇和本篇,我们都在用eureka和service这两个容器做实验,现在就来看看他们是怎么做出来的:

  1. eureka是个maven工程,和SpringCloud环境中的eureka服务一样,唯一不同的是它的pom.xml中使用了jib插件,用来将工程构建成docker镜像:
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd”>

4.0.0

com.bolingcavalry

eureka

0.0.1-SNAPSHOT

jar

eureka

eureka

com.bolingcavalry

wait-for-it-demo

0.0.1-SNAPSHOT

…/pom.xml

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

<java.version>1.8</java.version>

<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>

org.springframework.cloud

spring-cloud-starter-netflix-eureka-server

org.springframework.boot

spring-boot-maven-plugin

com.google.cloud.tools

jib-maven-plugin

1.7.0

openjdk:8-jdk-stretch

bolingcavalry/ p r o j e c t . a r t i f a c t I d : {project.artifactId}: project.artifactId:{project.version}

-Xms1g

-Xmx1g

8080

true

compile

dockerBuild

上述pom.xml中多了个jib插件,这样在执行mvn compile的时候,插件就会用构建结果制作好docker镜像并放入本地仓库;

2. service是个普通的SpringCloud应用,除了在pom.xml中也用到了jib插件来构建镜像,它的配置文件中,访问eureka的地址要写成eureka容器的名称:

spring:

application:

name: service

eureka:

client:

serviceUrl:

defaultZone: http://eureka:8080/eureka/

  1. 关于如何将java应用制作成docker镜像,如果您想了解更多请参考以下两篇文章:

《Docker与Jib(maven插件版)实战》

《Jib使用小结(Maven插件版)》

制作基础镜像

从上面的pom.xml可见,我们将Java应用制作成docker镜像时,使用的基础镜像是openjdk:8-jdk-stretch,这样做出的应用镜像是不含wait-for-it.sh脚本的,自然就无法实现启动顺序控制了,因此我们要做一个带有wait-for-it.sh的基础镜像给业务镜像用:

  1. 把wait-for-it.sh文件准备好,下载地址:https://raw.githubusercontent.com/zq2599/blog_demos/master/wait-for-it-demo/docker/wait-for-it.sh

  2. 在wait-for-it.sh文件所在目录新建Dockerfile文件,内容如下:

FROM openjdk:8-jdk-stretch

ADD wait-for-it.sh /wait-for-it.sh

RUN sh -c ‘chmod 777 /wait-for-it.sh’

注意:我这里用的是openjdk:8-jdk-stretch,您可以根据自己的实际需要选择不同的openjdk版本,可以参考:《openjdk镜像的tag说明》

  1. 执行命令docker build -t bolingcavalry/jkd8-wait-for-it:0.0.2 .就能构建出名为bolingcavalry/jkd8-wait-for-it:0.0.2的镜像了,请您根据自己的情况设置镜像名称和tag,注意命令的末尾有个小数点,不要漏了;

  2. 如果您有hub.docker.com账号,建请使用docker push命令将新建的镜像推送到镜像仓库上去,或者推送到私有仓库,因为后面使用jib插件构建镜像是,jib插件要去仓库获取基础镜像的元数据信息,取不到会导致构建失败;

使用新的基础镜像构建service镜像

我们的目标是让service服务等待eureka服务就绪,所以应该改造service服务,让它用docker官方推荐的wait-for-it.sh方案来实现等待:

  • 修改service工程的pom.xml,有关jib插件的配置改为以下内容:

com.google.cloud.tools

jib-maven-plugin

1.7.0

bolingcavalry/jkd8-wait-for-it:0.0.2

bolingcavalry/ p r o j e c t . a r t i f a c t I d : {project.artifactId}: project.artifactId:{project.version}

INHERIT

8080

true

compile

dockerBuild

上述配置有几点需要注意:

a. 基础镜像改为刚刚构建好的bolingcavalry/jkd8-wait-for-it:0.0.2

b. 增加entrypoint节点,内容是INHERIT,按照官方的说法,entrypoint的值等于INHERIT表示jib插件不构建启动命令了,此时要使用者自己控制,可以在启动时输入,或者写在基础镜像中,这样我们在docker-compose.yml中用command参数来设置service容器的启动命令,就可以把wait-for-it.sh脚本用上了

c. 去掉jvmFlags节点,按照官方文档的说法,entrypoint节点的值等于INHERIT时,jvmFlags和mainClass参数会被忽略,如下图,地址是:https://github.com/GoogleContainerTools/jib/tree/master/jib-maven-plugin

在这里插入图片描述

至此,service工程改造完毕,接下来修改docker-compose.yml,让service容器能用上wait-for-it.sh

;