51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

使用 Spring Boot + Jib 为应用程序构建优化的 Docker 镜像

使用 Spring Boot + Jib 为应用程序构建优化的 Docker 镜像

Jib 框架介绍

Jib 是一个由 Google 开发的开源工具,旨在为 Java 应用程序提供一种简单、高效且无需编写 Dockerfile 的方式来构建 Docker 镜像。它能够直接从 Maven 或 Gradle 项目中构建容器镜像,并将应用程序及其依赖项优化打包到镜像中。

Jib 的主要优点包括:

  1. 快速构建:避免了复杂的 Dockerfile 编写和构建过程,大大提高了构建速度。

  2. 分层优化:能够智能地对应用程序的依赖、资源和代码进行分层,提高缓存命中率和镜像推送效率。

  3. 可重复性:基于项目的配置和依赖进行构建,确保每次构建的结果一致性。

准备工作

首先,创建一个 Spring Boot 项目。以下是项目的 pom.xml 依赖配置:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.12</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>docker-example</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>docker-example</name>
    <description>Demo project for Spring Boot Docker with Jib</description>

    <properties>
        <java.version>17</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- 引入 Jib 插件依赖 -->
        <dependency>
            <groupId>com.google.cloud.tools</groupId>
            <artifactId>jib-maven-plugin</artifactId>
            <version>3.3.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>com.google.cloud.tools</groupId>
                <artifactId>jib-maven-plugin</artifactId>
                <configuration>
                    <from>
                        <image>openjdk:17-jre-alpine</image>
                    </from>
                    <to>
                        <image>your-docker-hub-username/docker-example</image>
                    </to>
                    <layers>
                        <enabled>true</enabled>
                        <optimize>true</optimize>
                    </layers>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

在上述配置中,<layers> 节点下的 <enabled>true</enabled> 表示启用分层功能,<optimize>true</optimize> 表示对分层进行优化。

接下来,创建 application.yaml 属性文件配置:

server:
  port: 8080

# Jib 框架相关配置
jib:
  layers:
    enabled: true
    optimize: true

使用 Jib 进行分层优化的说明

Jib 在构建 Docker 镜像时,会自动将应用程序分为多个层。例如,它会将依赖项、资源文件和应用程序的代码分别放在不同的层中。

这样做的好处在于:

  1. 当依赖项或资源文件没有发生变化时,再次构建镜像时可以利用缓存,大大加快构建速度。

  2. 在推送镜像时,如果只有某一层发生了变化,只需推送该层,而无需重新推送整个镜像,节省了网络带宽和时间。

要实现分层优化,您需要确保在 pom.xml 中的 Jib 配置中开启分层功能(如上述示例中的配置),并且合理组织项目的结构和依赖,使得 Jib 能够有效地识别和分离不同的层。

使用 Jib 构建 Docker 镜像的步骤

  1. 确保已经正确配置了 pom.xml 文件,引入了 Jib 插件并设置了相关的构建配置。

  2. 配置 application.yaml 文件,根据需要设置应用的属性和 Jib 的相关参数。

  3. 打开终端或命令提示符,进入项目的根目录。

  4. 运行构建命令

    mvn clean package jib:build
    
    • mvn :调用 Maven 命令行工具。

    • clean :执行清理操作,删除之前构建生成的临时文件和输出。

    • package :对项目进行打包,包括编译代码、处理资源文件等。

    • jib:build :调用 Jib 插件的构建命令,根据配置构建 Docker 镜像。

代码示例

以下是一个简单的 Spring Boot 控制器示例:

package com.example.dockerExample.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello() {
        return "Hello, Docker with Jib!";
    }
}

生成 Docker 镜像、发布启动镜像及测试访问的命令及示例

  1. 生成 Docker 镜像命令:如上述步骤中提到的 mvn clean package jib:build

  2. 发布启动镜像命令:假设您已经将镜像推送到了 Docker Hub 上,并且您的镜像名为 your-docker-hub-username/docker-example ,则可以使用以下命令启动容器:

    docker run -p 8080:8080 your-docker-hub-username/docker-example

  3. 测试访问:在浏览器中输入 http://localhost:8080/hello ,如果能看到 Hello, Docker with Jib! 则说明访问成功。

总结

通过使用 Spring Boot 和 Jib 的结合,我们能够轻松地构建出优化的 Docker 镜像,大大简化了部署流程,提高了应用的可移植性和可扩展性。

赞(7)
未经允许不得转载:工具盒子 » 使用 Spring Boot + Jib 为应用程序构建优化的 Docker 镜像