几种常见的构建模式及其使用方法

简介: 几种常见的构建模式及其使用方法

在微服务架构中,将 Spring Boot 应用打包成 Docker 镜像是实现应用部署和管理的重要步骤。为了方便不同环境的需求,我们可以采用多种模式来构建 Docker 镜像。下面将详细介绍几种常见的构建模式及其使用方法。

 

1. Dockerfile 基本模式

 

这是最基本也是最常用的方式,通过编写 `Dockerfile` 来定义镜像的构建过程。

 

示例 `Dockerfile`

 

```dockerfile
# 使用官方的 OpenJDK 作为基础镜像
FROM openjdk:17-jdk-alpine
 
# 设置工作目录
WORKDIR /app
 
# 把 JAR 文件复制到镜像中
COPY target/myapp-0.0.1-SNAPSHOT.jar app.jar
 
# 暴露应用运行的端口
EXPOSE 8080
 
# 启动应用
ENTRYPOINT ["java", "-jar", "app.jar"]
```

 

构建和运行镜像

 

```sh
# 构建 Docker 镜像
docker build -t my-spring-boot-app .
 
# 运行容器
docker run -p 8080:8080 my-spring-boot-app
```

 

2. 多阶段构建模式

 

多阶段构建可以减少最终镜像的大小,只保留运行所需的文件。

 

示例 `Dockerfile`

 

```dockerfile
# 第一阶段:构建阶段
FROM maven:3.8.4-openjdk-17 AS builder
 
WORKDIR /build
 
# 将 Maven 项目文件复制到工作目录
COPY pom.xml .
 
# 下载项目依赖
RUN mvn dependency:go-offline
 
# 复制项目源代码
COPY src ./src
 
# 打包项目
RUN mvn package -DskipTests
 
# 第二阶段:运行阶段
FROM openjdk:17-jdk-alpine
 
WORKDIR /app
 
# 从构建阶段复制打包好的 JAR 文件
COPY --from=builder /build/target/myapp-0.0.1-SNAPSHOT.jar app.jar
 
EXPOSE 8080
 
ENTRYPOINT ["java", "-jar", "app.jar"]
```

 

构建和运行镜像

 

```sh
# 构建 Docker 镜像
docker build -t my-spring-boot-app .
 
# 运行容器
docker run -p 8080:8080 my-spring-boot-app
```

 

3. 使用 Jib 构建镜像

 

[Jib](https://github.com/GoogleContainerTools/jib) 是 Google 提供的一款工具,可以直接从 Maven 或 Gradle 项目构建 Docker 镜像,无需编写 `Dockerfile`。

 

Maven 配置

 

在 `pom.xml` 中添加 Jib 插件配置:

 

```xml
<build>
    <plugins>
        <plugin>
            <groupId>com.google.cloud.tools</groupId>
            <artifactId>jib-maven-plugin</artifactId>
            <version>3.1.4</version>
            <configuration>
                <to>
                    <image>my-spring-boot-app</image>
                </to>
            </configuration>
        </plugin>
    </plugins>
</build>
```

 

构建和运行镜像

 

```sh
# 使用 Jib 构建 Docker 镜像
mvn compile jib:buildTar -Dimage=my-spring-boot-app
 
# 加载镜像到 Docker
docker load --input target/jib-image.tar
 
# 运行容器
docker run -p 8080:8080 my-spring-boot-app
```

 

4. 使用 Spring Boot 的内置支持

 

Spring Boot 2.3+ 版本开始,提供了原生的 Docker 镜像构建支持。

 

Maven 配置

 

在 `pom.xml` 中添加 Spring Boot 插件配置:

 

```xml
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>2.5.4</version>
            <executions>
                <execution>
                    <goals>
                        <goal>build-image</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
```

 

构建和运行镜像

 

```sh
# 使用 Spring Boot 插件构建 Docker 镜像
mvn spring-boot:build-image -Dspring-boot.build-image.imageName=my-spring-boot-app
 
# 运行容器
docker run -p 8080:8080 my-spring-boot-app
```

 

5. 总结

 

以上是几种常见的 Spring Boot 应用构建 Docker 镜像的方式,每种方式都有其适用的场景:

 

1. **基本模式**:简单直接,适合初学者和小型项目。

2. **多阶段构建模式**:优化镜像大小,适合对性能和体积有要求的项目。

3. **Jib**:无需 `Dockerfile`,自动处理依赖和优化,适合希望简化构建过程的项目。

4. **Spring Boot 内置支持**:集成度高,适合使用 Spring Boot 最新特性的项目。

 

根据具体需求选择合适的方式,可以显著提升开发和部署效率。

 

另外,无论使用哪种方式构建 Docker 镜像,都可以结合容器编排工具如 Kubernetes 来进行部署和管理。通过将 Spring Boot 应用打包成 Docker 镜像,可以实现应用的快速部署和横向扩展,同时也能够提高应用的可移植性和环境一致性。在生产环境中,合理选择合适的构建方式,并结合持续集成/持续部署 (CI/CD) 工具进行自动化构建和部署,将有助于提升整个开发流程的效率和稳定性。

目录
相关文章
|
2月前
第八章 Helm 模板高效互用动态参数生成
第八章 Helm 模板高效互用动态参数生成
38 1
|
2月前
|
设计模式 Dart
生成器(构建器)模式-原理到实战应用(Dart版)
生成器(构建器)模式-原理到实战应用(Dart版)
41 0
|
2月前
|
小程序 JavaScript
小程序bindtap 和 catchtap 的区别以及如何使用
小程序bindtap 和 catchtap 的区别以及如何使用
57 0
|
26天前
|
运维 Serverless 网络安全
Serverless 应用引擎产品使用合集之能否用一个顶层函数,在云端动态的增加函数脚本或删除脚本
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
9天前
|
运维 JavaScript Serverless
函数计算产品使用问题之构建自己的流水线时,已经有一个基础第三方包的层,想在这个基础上进行额外的第三方包安装,该如何实现
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
2月前
|
监控 安全
管道的三种使用方案中,唯一正确而安全的使用方法
管道的三种使用方案中,唯一正确而安全的使用方法
8 0
|
2月前
|
存储 缓存 算法
【Conan 入门教程】从零开始编写第一个自定义部署器
【Conan 入门教程】从零开始编写第一个自定义部署器
54 1
|
2月前
|
存储 JSON Shell
进一步学习 nox 教程,轻松掌握命令行用法
进一步学习 nox 教程,轻松掌握命令行用法
24 1
|
2月前
|
编译器 定位技术 C++
【CMake高级技巧】如何创建一个通用的库查找模板?
【CMake高级技巧】如何创建一个通用的库查找模板?
52 0
|
2月前
|
存储 数据处理 API
【C# 控制台】主要讲述以下C#的部分语法,部分基础,做到了解作用
【C# 控制台】主要讲述以下C#的部分语法,部分基础,做到了解作用

相关实验场景

更多