SpringBoot(2.3)应用制作Docker镜像的方法是怎样的
SpringBoot(2.3)应用制作Docker镜像的方法是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
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项目中有多个文件夹,本章的应用在dockerlayerdemo文件夹下,如下图红框所示:
版本信息
SpringBoot:2.3.0.RELEASE
JDK:1.8.0_121
Maven:3.3.9
Docker:19.03.8
操作系统:MacBook pro 13寸,macOS Catalina 10.15.4
构建镜像实战
修改pom.xml,给spring-boot-maven-plugin插件的配置增加子节点,enabled的值为true,如下图红框所示:
在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-stretchWORKDIR application# 前一阶段从jar中提取除了多个文件,这里分别执行COPY命令复制到镜像空间中,每次COPY都是一个layerCOPY --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 .
镜像构建成功的提示如下:
验证
执行以下命令创建并启动容器:
docker run --rm -p 8080:8080 dockerlayerdemo:0.0.1
启动成功的控制台信息:
3. 浏览器访问:http://localhost:8080/hello ,如下图,一切正常:
4. 看看镜像的分层信息,执行命令:
docker history dockerlayerdemo:0.0.1
如下图,整个jar的内容,例如class、依赖库、依赖资源等,分多次COPY到镜像空间中,所以今后如果只改了class,在更新镜像的时候,只需要下载class的layer即可(其他layer可以直接用之前缓存到本地的):
至此,SpringBoot-2.3.0.RELEASE官方推荐的镜像构建方式就实践完成了,但是也留下了一些疑问:
2.3版本推荐的镜像构建方案,和旧版本比有什么不同?
pom.xml中spring-boot-maven-plugin插件新增的参数,到底做了什么?
Dockerfile中,java -Djarmode=layertools -jar application.jar extract这个操作啥意思?
看完上述内容,你们掌握SpringBoot(2.3)应用制作Docker镜像的方法是怎样的的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!