SpringBoot制作Docker镜像实战

注:本文基于SpringBoot的2.3.0版本。具体版本如下:

  1. SpringBoot:2.3.0.RELEASE
  2. JDK:1.8.0_121
  3. Maven:3.3.9
  4. Docker:19.03.8
  5. 操作系统:MacBook pro 13寸,macOS Catalina 10.15.4

如果您使用了SpringBoot-2.3.0,可以按照官方推荐的方案来制作Docker镜像,接下来通过实战学习SpringBoot官方推荐的镜像制作方案;

构建镜像

修改pom.xml,给spring-boot-maven-plugin插件的配置增加子节点,enabled的值为true,如下图红框所示:

体验SpringBoot(2.3)应用制作Docker镜像(官方方案)

在pom.xml文件所在目录新增Dockerfile文件,内容如下:

# 指定基础镜像,这是分阶段构建的前期阶段
FROM openjdk:8u212-jdk-stretch as builder
# 执行工作目录
WORKDIR application
# 配置参数
ARG JAR_FILE=target/*.jar
# 将编译构建得到的jar文件复制到镜像空间中
COPY ${JAR_FILE} application.jar
# 通过工具spring-boot-jarmode-layertools从application.jar中提取拆分后的构建结果
RUN java -Djarmode=layertools -jar application.jar extract

# 正式构建镜像
FROM openjdk:8u212-jdk-stretch
WORKDIR application
# 前一阶段从jar中提取除了多个文件,这里分别执行COPY命令复制到镜像空间中,每次COPY都是一个layer
COPY --from=builder application/dependencies/ ./
COPY --from=builder application/spring-boot-loader/ ./
COPY --from=builder application/snapshot-dependencies/ ./
COPY --from=builder application/application/ ./
ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]

执行以下命令编译构建工程:

mvn clean package -U -DskipTests

编译构建完成后确保target目录有jar文件生成;

在Dockerfile所在目录执行以下命令构建镜像(请按照您的实际情况调整镜像名):

docker build -t dockerlayerdemo:0.0.1 .

镜像构建成功的提示如下:

体验SpringBoot(2.3)应用制作Docker镜像(官方方案)
验证镜像

执行以下命令创建并启动容器:

docker run --rm -p 8080:8080 dockerlayerdemo:0.0.1

启动成功的控制台信息:

体验SpringBoot(2.3)应用制作Docker镜像(官方方案)

浏览器访问:http://localhost:8080/hello ,一切正常,显示相应的网页内容,则验证成功。

看看镜像的分层信息,执行命令:

docker history dockerlayerdemo:0.0.1

如下图,整个jar的内容,例如class、依赖库、依赖资源等,分多次COPY到镜像空间中,所以今后如果只改了class,在更新镜像的时候,只需要下载class的layer即可(其他layer可以直接用之前缓存到本地的)

至此,SpringBoot-2.3.0.RELEASE官方推荐的镜像构建方式就实践完成了。

发表评论

邮箱地址不会被公开。 必填项已用*标注