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

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

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

目录
相关文章
|
缓存 Java API
【云原生】Spring Cloud Gateway的底层原理与实践方法探究
【云原生】Spring Cloud Gateway的底层原理与实践方法探究
|
存储 SQL Java
bigdata-18-Hive数据结构与存储格式
bigdata-18-Hive数据结构与存储格式
200 0
|
Java Maven Windows
Maven 配置指南
Maven 配置指南
Maven 配置指南
|
6月前
|
SQL 分布式计算 数据库
【YashanDB 知识库】Hive 命令工具 insert 崖山数据库报错
【YashanDB 知识库】Hive 命令工具 insert 崖山数据库报错
|
10月前
|
应用服务中间件 nginx Docker
Docker Swarm、Docker Stack和Portainer的使用
Docker Swarm、Docker Stack 和 Portainer 各有其独特的功能和优势。Docker Swarm 适用于分布式服务的管理和编排,Docker Stack 便于多容器应用的定义和部署,而 Portainer 提供了直观的 UI,简化了 Docker 环境的管理。结合使用这些工具,可以大大提高容器化应用的部署和管理效率。希望本文对您理解和应用这些工具有所帮助。
499 5
|
存储 网络协议 NoSQL
从零实现kv存储V1.0:array初版
从零实现kv存储V1.0:array初版
186 1
|
消息中间件 Go API
Golang深入浅出之-Go语言中的微服务架构设计与实践
【5月更文挑战第4天】本文探讨了Go语言在微服务架构中的应用,强调了单一职责、标准化API、服务自治和容错设计等原则。同时,指出了过度拆分、服务通信复杂性、数据一致性和部署复杂性等常见问题,并提出了DDD拆分、使用成熟框架、事件驱动和配置管理与CI/CD的解决方案。文中还提供了使用Gin构建HTTP服务和gRPC进行服务间通信的示例。
789 0
|
Web App开发 编解码 缓存
基于WebAssembly的H.265播放器
本次演讲由腾讯高级工程师陈映平为大家介绍基于WebAssembly的H.265播放器,以及在NOW直播中的应用。本次主要介绍采用WebAssembly制作音视频H.265播放器的整体思路、播放器架构设计以及线上实践。
基于WebAssembly的H.265播放器
|
tengine 弹性计算 Linux
Alibaba Cloud Linux 2实践之安装配置Tengine
本场景介绍如何在Alibaba Cloud Linux 2上安装配置Tengine。