网上看到这篇文件,觉得很不错,这里转载一下,主要学习该文章中使用分层缓存,处理镜像大小 思路。
转自:Java SpringBoot 项目构建 Docker 镜像调优实践 | 小豆丁技术栈
PS:已经在生产实践中验证,解决在生产环境下,网速带宽小,每次推拉镜像影响线上服务问题,按本文方式构建镜像,除了第一次拉取、推送、构建镜像慢,第二、三...次都是几百K大小传输,速度非常快,构建、打包、推送几秒内完成。
前言:
以前的 SpringCloud 微服务时代以 “Jar包" 为服务的基础,每个服务都打成 Jar 供服务间相互关联与调用。而 现在随着 Kubernetes 流行,已经变迁到一个镜像一个服务,依靠 Kubernetes 对镜像的统一编排进行对服务进行统一管理。在对 Kubernetes 微服务实践过程中,接触最多的肯定莫过于 Docker 镜像。由于本人使用的编程语言是 Java,所以对 Java SpringBoot 项目接触比较多,所以比较关心如何更好的通过 Dockerfile 编译 Docker 的镜像。
Kubernetes 微服务简单说就是一群镜像间的排列组合与相互间调的关系,故而如何编译镜像会使服务性能更优,使镜像构建、推送、拉取速度更快,使其占用网络资源更少这里优化,更易使用成为了一个重中之重的事情,也是一个非常值得琢磨的问题。这里我将对 SpringBoot 项目打包 Docker 镜像如何写 Dockerfile 的探究进行简单叙述。
系统环境:
- Docker 版本: 18.09.3
- Open JDK 基础镜像版本:openjdk:8u212-b04-jre-slim
- 测试用的镜像仓库:阿里云 Docker Hub
- 项目 Github: https://github.com/my-dlq/blog-example/tree/master/springboot/springboot-dockerfile
一、探究常规 Springboot 如何编译 Docker 镜像
这里将用常规 SpringBoot 编译 Docker 镜像的 Dockerfile 写法,感受下这种方式编译的镜像用起来如何。
1、准备编译镜像的 SpringBoot 项目
这里准备一个经过 Maven 编译后的普通的 springboot 项目来进行 Docker 镜像构建,项目内容如下图所示,可以看到要用到的就是里面的应用程序的 Jar 文件,将其存入镜像内完成镜像构建任务。
- jar 文件大小:70.86mb
2、准备 Dockerfile 文件
构建 Docker 镜像需要提前准备 Dockerfile 文件,这个 Dockerfile 文件中的内容为构建 Docker 镜像执行的指令。下面是一个常用的 SpringBoot 构建 Docker 镜像的 Dockerfile,将它放入 Java 源码目录(target 的上级目录),确保下面设置的 Dockerfile 脚本中设置的路径和 target 路径对应。
FROM openjdk:8u212-b04-jre-slim
VOLUME /tmp
ADD target/*.jar app.jar
RUN sh -c 'touch /app.jar'
ENV JAVA_OPTS="-XX:MaxRAMPercentage=80.0 -Duser.timezone=Asia/Shanghai"
ENV APP_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar $APP_OPTS" ]
3、构建 Docker 镜像
通过 Docker build 命令构建 Docker 镜像,观察编译的时间。
由于后续需要将镜像推送到 Aliyun Docker 仓库,所以镜像前缀用了 Aliyun。
- time:此参数会显示执行过程经过的时间
$ time docker build -t registry.cn-beijing.aliyuncs.com/mydlq/springboot:0.0.1 .
构建过程
Sending build context to Docker daemon 148.7MB
Step 1/7 : FROM openjdk:8u212-b04-jre-slim
8u212-b04-jre-slim: Pulling from library/openjdk
743f2d6c1f65: Already exists
b83e581826a6: Pull complete
04305660f45e: Pull complete
bbe7020b5561: Pull complete
Digest: sha256:a5bcd678408a5fe94d13e486d500983ee6fa594940cbbe137670fbb90030456c
Status: Downloaded newer image for openjdk:8u212-b04-jre-slim
---> 7c6b62cf60ee
Step 2/7 : VOLUME /tmp
---> Running in 13a67ab65d2b
Removing intermediate container 13a67ab65d2b
---> 52011f49ddef
Step 3/7 : ADD target/*.jar app.jar
---> 26aa41a404fd
Step 4/7 : RUN sh -c 'touch /app.jar'
---> Running in 722e7e44e04d
Removing intermediate container 722e7e44e04d
---> 7baedb10ec62
Step 5/7 : ENV JAVA_OPTS="-XX:MaxRAMPercentage=80.0 -Duser.timezone=Asia/Shanghai"
---> Running in 2681d0c5edac
Removing intermediate container 2681d0c5edac
---> 5ef4a794b992
Step 6/7 : ENV APP_OPTS=""
---> Running in 5c8924a2a49d
Removing intermediate container 5c8924a2a49d
---> fba87c19053a
Step 7/7 : ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar $APP_OPTS" ]
---> Running in c4cf97009b3c
Removing intermediate container c4cf97009b3c
---> d5f30cdfeb81
Successfully built d5f30cdfeb81
Successfully t