Container Images
Spring Boot 应用程序可以通过 使用 Dockerfiles 或 使用 Cloud Native Buildpacks 进行容器化,以创建可在任何地方运行的优化后的 docker 兼容容器镜像。
章节总结
📄️ 高效的容器镜像
将 Spring Boot 的 uber jar 打包为 Docker 镜像是很容易实现的。然而,直接在 Docker 镜像中复制并运行该 uber jar 存在一些缺点。在不进行解压的情况下运行 uber jar 总会带来一定的开销,在容器化环境中这种开销可能较为明显。另一个问题是,将应用程序代码及其所有依赖项放在 Docker 镜像的同一层中并非最优方案。由于你重新编译代码的频率通常高于升级所使用的 Spring Boot 版本的频率,因此更细致地分离各部分内容往往效果更好。如果你在应用程序类之前将 jar 文件放入某一层,Docker 通常只需更改最底层,其余层则可直接从缓存中获取。
📄️ Dockerfiles
虽然只需在 Dockerfile 中写入几行代码即可将 Spring Boot 的 uber jar 转换为 Docker 镜像,但使用分层功能将生成一个优化的镜像。当你创建一个包含分层索引文件的 jar 时,spring-boot-jarmode-tools jar 会被作为依赖项添加到你的 jar 中。当该 jar 位于类路径上时,你可以以一种特殊模式启动应用程序,这种模式允许引导代码运行与你的应用程序完全不同的内容,例如提取分层的工具。
📄️ Cloud Native Buildpacks
Docker 镜像可以直接通过你的 Maven 或 Gradle 插件使用 Cloud Native Buildpacks 构建。如果你曾经使用过诸如 Cloud Foundry 或 Heroku 这样的应用平台,那么你很可能已经用过 buildpack。Buildpack 是平台中负责将你的应用程序转换为平台可实际运行内容的部分。例如,Cloud Foundry 的 Java buildpack 会检测到你正在推送一个 .jar 文件,并自动添加相应的 JRE。