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

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

在微服务架构中,将 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) 工具进行自动化构建和部署,将有助于提升整个开发流程的效率和稳定性。

目录
相关文章
|
6月前
|
设计模式 Dart
生成器(构建器)模式-原理到实战应用(Dart版)
生成器(构建器)模式-原理到实战应用(Dart版)
86 0
|
6月前
|
小程序 JavaScript
小程序bindtap 和 catchtap 的区别以及如何使用
小程序bindtap 和 catchtap 的区别以及如何使用
131 0
|
5月前
|
Java 开发者 Spring
深入解析这两种扩展机制的工作原理和用法
深入解析这两种扩展机制的工作原理和用法
|
1月前
|
Cloud Native Devops Shell
ArgoWorkflow教程(六)---无缝实现步骤间参数传递
本文为ArangoWorkflow系列教程第六篇,详细介绍了在同一Workflow中不同步骤间如何实现参数传递,避免了通过文件传递的不便。文章重点讲解了导出结果和导入参数的方法,并演示了如何将上一步骤的输出参数作为下一步骤的输入参数。此外,还介绍了ArgoWorkflow内置的`result`参数,可用于捕获容器的标准输出。通过具体示例和代码片段,读者可轻松掌握这一重要功能。
43 0
|
1月前
|
设计模式 机器学习/深度学习 算法
现代 Python:编写高效代码的模式、功能和策略(第 1 部分)
现代 Python:编写高效代码的模式、功能和策略(第 1 部分)
28 0
|
6月前
|
监控 安全
管道的三种使用方案中,唯一正确而安全的使用方法
管道的三种使用方案中,唯一正确而安全的使用方法
20 0
|
6月前
|
机器学习/深度学习 存储 算法
C++ 模版函数介绍:介绍模版函数的基本概念、用法和作用
C++ 模版函数介绍:介绍模版函数的基本概念、用法和作用
66 1
|
6月前
|
存储 JSON Shell
进一步学习 nox 教程,轻松掌握命令行用法
进一步学习 nox 教程,轻松掌握命令行用法
55 1
|
6月前
|
编译器 定位技术 C++
【CMake高级技巧】如何创建一个通用的库查找模板?
【CMake高级技巧】如何创建一个通用的库查找模板?
81 0
|
6月前
|
存储 数据处理 API
【C# 控制台】主要讲述以下C#的部分语法,部分基础,做到了解作用
【C# 控制台】主要讲述以下C#的部分语法,部分基础,做到了解作用