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