然而,引入了容器的概念后,开发者在面对这个问题时有了更好的解决方案。容器将整个软件堆栈打包成一个独立的实体,并可以方便地进行部署,不再受限于"在我的机器上可以运行"的问题。
因此,今天我们介绍三种构建Spring Boot应用程序的Docker镜像的机制:Spring Boot构建插件;Fabric8 Maven插件;JIB Maven插件。
创建应用程序
访问https://start.spring.io,并创建一个仅包含spring-web依赖项的应用程序。
添加一个简单的控制器来接受一些请求。
@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"时,会得到一个响应"All Ok"。
接下来,使用Spring Boot构建插件构建我们的Docker镜像。
1 使用Spring Boot构建插件构建Docker镜像
Spring Boot的构建插件提供了一种使用BuildPacks概念创建Docker镜像的方法。Build Packs提供了一种定义应用程序构建方式的方法。它会检测应用程序的类型并进行构建,以便在特定平台上或独立于平台运行。
现在,Spring Boot的构建插件使用BuildPack构建器镜像,会自动检测到它是一个Spring Boot应用程序,并构建相关的镜像。
只需要使用Maven在Spring Boot应用程序上调用image-build目标即可。
mvn spring-boot:build-image
这将从BuildPacks中拉取基础构建器镜像,以检测应用程序的类型并选择适用于该应用程序的构建包。然后,它使用所选的构建包构建您的最终镜像。
这里是一个显示构建包所需的构建过程的日志。
===> 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'
可以使用参数指定最终镜像的名称,如下所示:
mvn spring-boot:build-image \
-Dspring-boot.build-image.imageName=my-spring-boot-image
或者可以在配置中指定,如下所示:
org.springframework.boot
spring-boot-maven-plugin
my-spring-boot-image
现在,可以在这里进行一些级别的自定义。如果想真正自定义镜像的构建过程,需要创建自己的构建器镜像来定义构建过程。
2 使用Fabric8 Maven插件构建Docker镜像
Fabric8 Maven插件为构建和部署Java应用程序提供了一种简化的方法,包括创建Docker镜像。
首先,需要在pom.xml文件中添加Fabric8 Maven插件的依赖项。
io.fabric8
docker-maven-plugin
0.37.0
docker-build
package
build
my-spring-boot-image
openjdk:11-jdk-slim
latest
artifact
配置部分非常简单。让我们看一下
在
在assembly部分,使用值为artifact的
最后,指定
运行maven构建命令后,镜像将被构建。
检查镜像的层,发现artifact被复制为最后一层,如下所示。
图片
可以创建分层的Docker镜像,通过在assembly标签中指定要创建的层以及需要在这些层中复制的内容。
现在,可以使用docker run -p 8080:8080 service-docker-image-build:0.0.1-SNAPSHOT简单地运行docker文件。
3 使用Google的JIB插件构建Docker镜像
让我们来看看来自Google的JIB插件。它是由Google提供和维护的工具之一,提供了相当详细的自定义级别。
com.google.cloud.tools
jib-maven-plugin
3.2.1
openjdk:17
jib-build-${project.name}:${project.version}
verify
dockerBuild
这里,在
现在,在
来看看创建的镜像的层次结构。
图片
图像的层次结构如下所示:
- 第 1 层:包含所有依赖项。
- 第 2 层:包含应用程序资源。
- 第 3 层:包含应用程序类。
- 第 4 层:包含jib-classpath-file,其中包含类路径信息,以及jib-main-class-file,其中包含要执行的完全限定的主类的名称。