优化Spring Boot镜像 🚀
优化Spring Boot镜像,让它更小更快 🚀
在上一篇博客里,我们学习了如何将Spring Boot项目打包成Docker镜像 (打包Spring Boot应用到Docker镜像)。不过,默认构建出来的镜像有点太大啦,启动速度也不太理想。今天咱们就来学习几个小技巧,让镜像变小变快吧!
使用更小的基础镜像 🐳
之前我们使用的是eclipse-temurin:17-jre作为基础镜像,它包含了完整的Java运行环境。不过对于运行时环境来说,我们完全可以选择更小的基础镜像,比如eclipse-temurin:17-jre-alpine
。
Alpine是一个面向安全应用的超级小型Linux发行版,可以大大减小镜像的体积哦。我们只需要将Dockerfile中的第一行修改为:
就这么简单!
优化Spring Boot镜像 🚀
Spring Boot有个非常赞的分层打包功能,可以将应用分成不同的层,包括依赖层、Spring Boot加载器层、快照依赖层和应用层等。这样一来,在构建Docker镜像时,我们就可以只复制需要的层,从而减小镜像体积了。
当执行命令时,Spring Boot将解压可执行jar包,并将上述四个层分别解压到以下目录:
- /dependencies/
- /spring-boot-loader/
- /snapshot-dependencies/
- /application/
多层构建优化 🧱
多层构建(multi-stage build)是另一个强大的优化技巧。这种方法巧妙地利用不同构建阶段的特性,大幅精简最终镜像体积。
具体步骤如下:
- 构建阶段: 使用功能完备的基础镜像,解压并处理Spring Boot的可执行jar包。
- 运行时阶段: 选用轻量级基础镜像,仅复制必要的应用文件。
这种”分而治之”的策略不仅能显著减小镜像体积,还能提升构建效率和应用性能。通过将构建过程与运行环境分离,我们可以在不影响最终镜像大小的情况下,充分利用构建阶段的各种工具和资源。
在构建镜像阶段,我们使用了eclipse-temurin:17-jre作为基础镜像。在运行时镜像阶段,我们切换到更小的eclipse-temurin:17-jre-alpine,只复制构建好的JAR包,并设置了启动命令。最后,我们还添加了一个java.security.egd的系统属性,以防JVM在启动时出现延迟 🐢
使用这些优化技巧,我们就能构建出体积小巧、启动超快的Spring Boot镜像了!赶紧试试看吧 🚀
其他优化建议 💡
除了上述几种优化技巧之外,我们还可以考虑以下一些优化:
- 启用Docker层缓存,加速镜像构建速度
- 使用.dockerignore排除不需要的文件
- 合理设置Java内存参数,防止内存不足
- 开启GC日志,以便排查内存问题