了解如何以3种方式创建没有 Docker 文件的 SpringBootDocker 映像
每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?3分钟?学习?何乐而不为?,希望?大家?点赞?,评论,加?关注?,你的?支持?是我?最大?的?动力?。
在本文中,我们将研究为 Spring 启动应用程序创建 docker 映像的一些方法。
随着技术的发展,服务于最终用户请求的应用程序的部署方式发生了变化。传统上,您需要一台机器来部署应用程序,并决定机器的配置以保持应用程序运行。
集装箱的引入,即将整个软件堆栈打包成一个单一的实体并将其发送,解决了开发人员世界中最大的问题之一。“它在我的机器上工作”:)
因此,今天我们将研究三种机制来构建 Spring 引导应用程序的 docker 映像。
- Spring Boot build 插件
- Fabric8 Maven 插件
- JIB Maven 插件
创建应用程序
让我们开始 https://start.spring.io ,创建一个只有 spring-web 依赖关系的应用程序。
让我们添加一个简单的控制器来接受一些请求。
Java
@RestController
@SpringBootApplication
public class ServiceDockerImageBuildApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceDockerImageBuildApplication.class, args);
}
@GetMapping("/")
public ResponseEntity get(){
return ResponseEntity.ok("All Ok");
当我们运行这个并打开“ http://localhost:8080”时,我们得到一个响应“一切正常”
通过这个,让我们使用开箱即用的构建插件来构建我们的 docker 映像。
使用 Spring 引导构建插件构建 Docker 映像
SpringBoot 的构建插件提供了一种使用 BuildPacks 概念创建 docker 映像的方法。BuildPacks 提供了一种定义如何构建应用程序的方法。它检测应用程序的类型并构建它,以便您可以在特定的平台上运行或独立于它。
现在,Spring Boot 的构建插件使用了一个 BuildPack 构建器映像,该映像将自动检测到它是一个 Spring 启动应用程序,并为您构建相关映像。
您唯一需要做的事情是使用 maven 在您的 Spring 启动应用程序上调用映像构建目标。
Shell
mvn spring-boot:build-image
这将从 BuildPacks 中提取基生成器映像,以检测应用程序的类型并为应用程序选择生成包。然后使用选定的构建包并构建最终映像。
下面的日志显示了构建应用程序所需的构建包。
Shell
===> DETECTING
[INFO] [creator] 6 of 24 buildpacks participating
[INFO] [creator] paketo-buildpacks/ca-certificates 3.2.4
[INFO] [creator] paketo-buildpacks/bellsoft-liberica 9.3.7
[INFO] [creator] paketo-buildpacks/syft 1.12.0
[INFO] [creator] paketo-buildpacks/executable-jar 6.2.4
[INFO] [creator] paketo-buildpacks/dist-zip 5.2.4
[INFO] [creator] paketo-buildpacks/spring-boot 5.12.0
...
...
[INFO] Successfully built image 'docker.io/library/service-docker-image-build:0.0.1-SNAPSHOT'
您总是可以使用如下所示的参数指定最终镜像的名称
Shell
mvn spring-boot:build-image \
-Dspring-boot.build-image.imageName=my-spring-boot-image
或者您可以在配置中指定它,如下所示
XML
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<imageName>my-spring-boot-image</imageName>
</configuration>
</plugin>
现在,我看到你可以在这里进行几个层次的定制。如果您想真正自定义映像的构建过程,则必须创建自己的构建器映像来定义构建过程。
让我们看看构建镜像的另一种方法。
使用 FABRIC8 Maven 插件构建 Docker 镜像
Fabric8是一个流行的集装箱化应用程序接口提供商。他们有客户端 API 来与 Kubernetes 集群通信,今天我们将使用他们的 maven 插件来构建 docker 映像。
XML
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.40.1</version>
<configuration>
<images>
<image>
<name>${project.name}:${project.version}</name>
<build>
<from>openjdk:17</from>
<assembly>
<name>build</name>
<descriptorRef>artifact</descriptorRef>
</assembly>
<ports>
<port>8080</port>
</ports>
<cmd>java -jar build/${project.name}-${project.version}.jar</cmd>
</build>
</image>
</images>
</configuration>
<executions>
<execution>
<id>build-image</id>
<phase>verify</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
</plugin>
配置部分非常简单,让我们看看 < build > 部分中的一些重要内容。
在这里,我们使用 < from > 标记指定基本镜像,然后在 < Assembly > 部分指定镜像的组装方式。
在 Assembly 部分,我们使用一个值工件指定 < description torRef > ,以表明我们只想复制构建的工件,而 < name > 标记指定它将被复制到目标映像中的哪个位置。DesciptorRef 有各种各样的选项,比如,如果您想将依赖项与工件一起复制,或者只复制依赖项,等等,您可以在这里找到它。因为我们建立了一个单一的脂肪罐,我们可以只复制工件。
最后,我们指定 < cmd > 来运行复制的 jar 文件。
运行 maven build 命令后,将生成映像。
我检查了镜像层,我看到工件被复制为最后一层,如下所示。
通过在组装标记中指定要创建的层以及需要在这些层中复制的内容,始终可以创建分层的 Docker 映像。您可以在此链接找到更多的自定义选项。
我们现在可以简单地使用 docker run-p 8080:8080 service-docker-image-build: 0.0.1-SNAPSHOT 运行 docker 文件
使用 Google 的 JIB 插件构建 Docker 镜像
让我们看看 Google 的 JIB 插件。它是 Google 提供和维护的工具之一,提供了相当详细的定制级别。
XML
<build>
<plugins>
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>3.2.1</version>
<configuration>
<from>
<image>openjdk:17</image>
</from>
<to>
<image>jib-build-${project.name}:${project.version}</image>
</to>
</configuration>
<executions>
<execution>
<phase>verify</phase>
<goals>
<goal>dockerBuild</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
在这里,我们在 < from > 标记中指定我们想要的基本镜像,在 < to > 标记中指定我们想要的最终镜像名称。
现在,我已经在 < execute > 部分中使用了 dockerBuild 目标,以便将 docker 映像构建到我的本地 docker 守护进程中。如果使用构建目标,JIB 插件将构建 docker 映像,并将其推送到相应的存储库。它支持所有主要的存储库,如 docker.io、 AWS ECR、 Google GCR、 Azure ACR 等。为此,可以设置身份验证机制来推送映像。你可以在这里读到。
让我们看看创建的镜像的层次。
如果你在上面的图片中看到,图层创建如下
- 第1层: 包含所有依赖项
- 第2层: 包含应用程序资源
- 第3层: 包含应用程序类
- 第4层: 包含jib-classpath-file 包含类路径信息和jib-main-class-file. 包含将要执行的完全限定主类的名称
您总是可以通过查找此链接中的选项来自定义构建镜像的方式
结论
今天我们看到了如何构建 docker 映像,而不需要手动编写 docker 文件。我们只需要在你的 maven 构建配置文件中包含一个插件,构建映像并将其推送到存储库中。
我个人喜欢的一个是 jib 插件,因为它的定制级别和 Docker 镜像层可以开箱即用。
你可以在这里找到我的 GitHub 回购的完整代码。