Spring Boot無需Dockerfile創建Docker鏡像三種方法

Spring Boot無需Dockerfile創建Docker鏡像三種方法    

     隨着技術的發展,服務於終端用戶請求的應用程序的部署方式也發生了變化。傳統上,你需要用一臺機器來部署應用程序,然後決定機器的配置,以保證應用程序的運行。容器的引入,即把整個軟件堆棧打包成一個單一的實體並進行運輸,解決了開發人員面臨的最大問題之一。"它能在我的機器上運行":) 因此,今天我們將探討爲 Spring Boot 應用程序構建 docker 鏡像的三種機制:

  • Spring Boot (spring-boot-maven-plugin) 插件
  • Fabric8 Maven 插件
  • Google 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 "時,會得到 "一切正常 "的迴應。

這樣,我們就可以使用開箱即用的構建插件來構建我們的 docker 鏡像了。

一. 使用 Spring Boot 構建插件構建 Docker 鏡像

image

Spring Boot 的構建插件提供了一種使用 BuildPacks 概念創建 docker 鏡像的方法。Build Packs 提供了一種定義應用程序構建方式的方法。它會檢測應用程序的類型並構建它,以便你能在特定平臺上運行或獨立於平臺運行。現在,Spring Boot 的構建插件使用 BuildPack 構建鏡像,它會自動檢測到這是一個 Spring Boot 應用程序,併爲你構建相關鏡像。你唯一需要做的就是使用 maven 在 Spring Boot 應用程序上調用 image-build goal

mvn spring-boot:build-image

是一個 Maven 命令,用於使用 spring-boot-maven-plugin 插件將 Spring Boot 應用程序打包成可執行的鏡像文件。這個命令的作用是自動生成跨全平臺的鏡像服務,無需再自己手動編寫 Dockerfile 文件。這個插件基於 buildpacks 這個規範,有一系列的生命週期,和 Maven 差不多。正常來說,如果是在互聯網環境下,它會自動檢測項目的語言、運行時環境(如 Python、Node.js、JVM)等,並自動從網絡下載對應的依賴,一鍵即可生成鏡像,非常方便。

image

Buildpacks 是一個程序,可以將源代碼轉換成容器鏡像,並在任意雲環境中運行。通常,buildpack 封裝了單一語言的生態工具鏈,適用於 Java、Ruby、Go、NodeJs、Python 等。相比 Maven,Buildpacks 有以下優勢:

1. 語言和框架支持:Buildpacks 支持多種語言和框架,可以根據應用程序的需要自動選擇適當的構建工具和運行時環境。而 Maven 主要針對 Java 應用程序,對於其他語言和框架的支持有限。
2. 自動化構建:Buildpacks 可以自動檢測應用程序的語言、框架和依賴,並根據需要提供所需的運行時環境和依賴項。這使得我們可以專注於應用程序的開發,而不必手動配置和管理構建過程中的各種環境和依賴。相比之下,Maven 需要手動配置和管理依賴和構建過程。
3. 集成開發環境支持:Buildpacks 能夠與集成開發環境無縫集成,提供一致的構建體驗。一些 IDE(如 VS Code 和 IntelliJ IDEA)已經支持使用 Buildpacks 來構建和調試應用程序,簡化了本地開發和測試的過程。這使得開發人員可以在熟悉的開發環境中輕鬆地使用 Buildpacks 進行應用程序開發和調試。
4. 自動化構建和持續集成/持續交付:Buildpacks 可以與自動化構建和持續集成/持續交付(CI/CD)流程集成,實現自動化的應用程序構建和部署。當代碼發生變化或觸發 CI/CD 流水線時,Buildpacks 可以自動重新構建應用程序,並生成新的可部署的鏡像,簡化了部署流程,並確保應用程序的構建和部署過程始終與代碼同步。相比之下,Maven 主要用於手動構建應用程序,而不是自動化構建和持續集成/持續交付。

這將從 BuildPacks 提取基礎生成器鏡像,以檢測應用程序的類型併爲應用程序選擇構建包。這個過程會連接GitHub與hub.docker.com下載依賴 然後,它會使用選定的構建包構建最終鏡像。

下面的日誌顯示了構建應用程序所需的構建包:

===> 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

或者在配置中指定,如下所示

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
       <imageName>my-spring-boot-image</imageName>
    </configuration>
</plugin>

現在,我看到這裏有幾個自定義級別。如果你想真正自定義圖像的構建過程,你必須創建自己的構建器圖像來定義你的構建過程。讓我們看看另一種構建鏡像的方法:

二. 使用 Fabric8 Maven 插件構建 Docker 鏡像

image

Fabric8 是容器化世界中最受歡迎的 API 提供商之一。

Fabric8 Maven 插件是一個用於簡化在 Java 應用程序中部署和管理 Kubernetes 和 OpenShift 資源的 Maven 插件。它的主要功能包括:

1. 構建 Docker 鏡像:Fabric8 Maven 插件可以自動構建應用程序的 Docker 鏡像,並將其推送到 Docker 註冊表中。
2. 創建 Kubernetes 和 OpenShift 資源:通過使用 Maven 的項目對象模型(POM),Fabric8 Maven 插件可以自動創建和管理 Kubernetes 和 OpenShift 資源,例如部署、服務、配置文件等。
3. 集成測試:插件支持集成測試,可以在構建過程中運行測試用例,並在部署到 Kubernetes 或 OpenShift 時進行驗證。
4. 配置管理:通過使用 POM 文件,用戶可以輕鬆地管理和修改應用程序的配置信息,以便在部署到生產環境時進行微調。

Fabric8 Maven 插件的優勢包括:

1. 簡化部署過程:通過自動化 Docker 鏡像構建、Kubernetes 和 OpenShift 資源創建以及集成測試,該插件簡化了 Java 應用程序的部署過程。
2. 提高開發效率:通過將部署和管理資源的過程集成到 Maven 構建過程中,開發人員可以更快速地迭代應用程序並部署到生產環境中。
3. 可擴展性:插件支持各種 Kubernetes 和 OpenShift 的版本和配置,可以根據項目需求進行定製和擴展。
4. 集成測試:該插件提供了集成測試功能,可以在部署前驗證應用程序的功能和性能。
5. 簡化配置管理:通過使用 POM 文件進行配置管理,可以輕鬆地修改應用程序的配置信息,並確保在部署時的一致性。

他們有與 Kubernetes 集羣通信的客戶端 API,今天我們將使用他們的 maven 插件來構建 docker 鏡像。

<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.40.1</version>
<configuration>
    <images>
       <image>
          <name>${project.name}:${project.version}</name>
          <build>
             <from>openjdk:17</from>
             <assembly>
                <name>build</name>
                <descriptorRef>artifact</descriptorRef>
             </assembly>
             <ports>
                <port>8080</port>
             </ports>
             <cmd>java -jar build/${project.name}-${project.version}.jar</cmd>
          </build>
       </image>
    </images>
</configuration>
    <executions>
    <execution>
       <id>build-image</id>
       <phase>verify</phase>
       <goals>
          <goal>build</goal>
       </goals>
    </execution>
    </executions>
</plugin>

配置部分非常簡單。讓我們看看 <build> 部分的一些重要配置。在這裏,我們使用 <from> 標記指定基本鏡像,然後在 <assembly> 部分指定鏡像的組裝方式。在裝配部分,我們指定了 <descriptorRef>,其值爲 artifact,以表示我們只想複製已構建的構件,而 <name> 標記則指定了目標圖像中將其複製到的位置。desciptorRef 有多種選項,比如是否要將依賴項與 artifact 一併複製或僅複製依賴項等,你可以在這裏找到。由於我們構建的是一個單一的胖 jar,因此只需複製工件即可。

最後,我們指定 <cmd> 來運行已複製的 jar 文件。運行 maven build 命令後,鏡像就構建完成了。

我檢查了鏡像層,發現工件作爲最後一層被複制,如下圖所示。

image-layer-fabric8

你總是可以創建一個分層的 docker 鏡像,方法是在程序集標籤中指定你想創建的層以及需要複製到這些層中的內容。你可以在這個鏈接中找到更多自定義選項。現在,我們只需使用 docker run -p 8080:8080 service-docker-image-build:0.0.1-SNAPSHOT 運行 docker 文件即可。

三. 使用谷歌的 JIB 插件構建 Docker image

image

讓我們來看看谷歌的 JIB 插件。它是由谷歌提供和維護的工具之一,提供了相當詳細的自定義級別

Jib Maven 插件的優勢主要體現在以下幾個方面:

1. **無需 Dockerfile**:傳統的 Dockerfile 構建方式需要編寫和維護 Dockerfile,而 Jib Maven 插件則無需編寫 Dockerfile,簡化了構建過程。
2. **快速構建**:Jib Maven 插件可以在本地構建鏡像,無需在 Docker 守護進程中運行,這大大加快了構建速度。
3. **靈活性**:Jib Maven 插件支持多種鏡像倉庫,包括 Docker Hub、Google Container Registry 等,同時也支持不同的鏡像標籤和鏡像名稱。
4. **安全性**:Jib Maven 插件支持自動簽名和驗證鏡像,確保鏡像的安全性。
5. **集成測試**:Jib Maven 插件可以集成測試,在構建過程中運行測試用例,並在部署到 Kubernetes 或 OpenShift 時進行驗證。
6. **簡化配置管理**:通過使用 POM 文件進行配置管理,可以輕鬆地修改應用程序的配置信息,並確保在部署時的一致性。


<build>
    <plugins>
       <plugin>
          <groupId>com.google.cloud.tools</groupId>
          <artifactId>jib-maven-plugin</artifactId>
          <version>3.2.1</version>
          <configuration>
             <from>
                <image>openjdk:17</image>
             </from>
             <to>
                <image>jib-build-${project.name}:${project.version}</image>
             </to>
          </configuration>
          <executions>
             <execution>
                <phase>verify</phase>
                <goals>
                   <goal>dockerBuild</goal>
                </goals>
             </execution>
          </executions>
       </plugin>
    </plugins>
</build>

在這裏,我們在 <from> 標籤中指定了我們想要的基本鏡像,並在 <to> 標籤中指定了我們想要的最終鏡像名稱。現在,我在 <execution> 部分使用了 dockerBuild 目標,這樣,docker 鏡像就會被構建到本地的 docker 守護進程中。如果使用了構建目標,JIB 插件就會構建 docker 鏡像,並將其推送到相應的版本庫。它支持所有主要的版本庫,如 docker.io、AWS ECR、Google GCR、Azure ACR 等。爲此,你可以設置推送鏡像的驗證機制。你可以在此閱讀相關內容。

讓我們來看看創建的鏡像層:

35b87957340d28888713fd695fecce2306fd3c4ed2f4210e2a7379895522bee1

35b87957340d28888713fd695fecce2306fd3c4ed2f4210e2a7379895522bee1

如上圖所示,層的創建過程如下:

第 1 層:包含所有依賴關係。

第 2 層:包含應用程序資源。

第 3 層:包含應用程序類。

第 4 層:包含 jib-classpath-file 文件(其中包含類路徑信息)和 jib-main-class-file 文件(其中包含將執行的完全合格的主類名稱)。 您可以通過此鏈接中的選項自定義鏡像的創建方式。

四. 總結

     今天我們看到了如何構建 docker 鏡像,而無需手動編寫 docker 文件。我們只需要在你的 maven 構建配置文件中加入一個插件,然後構建鏡像並推送到它的倉庫。Jib Maven、spring-boot-maven-plugin和Fabric8 Maven都是Maven插件,用於簡化和自動化Java應用程序的構建、部署和管理過程。它們各自具有一些優勢,但具體哪個更有優勢取決於具體的需求和使用場景。

     Jib Maven插件主要用於構建Docker鏡像,它無需編寫Dockerfile,可以直接將Java應用程序打包成Docker鏡像,並推送到容器倉庫中。Jib Maven插件的優勢在於簡化了Docker鏡像的構建過程,提高了構建效率,並提供了對多種鏡像倉庫的支持。

     Spring-boot-maven-plugin是Spring Boot官方提供的Maven插件,用於支持Spring Boot應用程序的構建和運行。它提供了豐富的功能,包括將Spring Boot應用程序打包爲可執行的jar或war文件,並在Maven的生命週期中提供了各種目標(goals),如運行、重新打包、啓動和停止應用程序等。spring-boot-maven-plugin的優勢在於與Spring Boot框架緊密集成,提供了全面的支持和豐富的功能。

     Fabric8 Maven插件主要用於Java應用程序在Kubernetes和OpenShift上的部署和管理。它提供了構建Docker鏡像、創建Kubernetes和OpenShift資源、集成測試以及配置管理等功能。Fabric8 Maven插件的優勢在於簡化了Java應用程序在雲原生環境中的部署和管理過程,提供了與Kubernetes和OpenShift的緊密集成,並支持各種配置和定製。

Jib Maven、spring-boot-maven-plugin和Fabric8 Maven都具有各自的優勢,具體選擇哪個插件取決於具體的需求和使用場景。如果主要關注Docker鏡像的構建和推送,可以考慮使用Jib Maven;如果需要全面的Spring Boot應用程序支持,可以選擇spring-boot-maven-plugin;如果需要在Kubernetes或OpenShift上部署和管理Java應用程序,可以考慮使用Fabric8 Maven插件。我個人比較喜歡的是 jib 插件,因爲它可以定製,而且開箱即可使用 docker 鏡像層。



今天先到這兒,希望對雲原生,技術領導力, 企業管理,系統架構設計與評估,團隊管理, 項目管理, 產品管管,團隊建設 有參考作用 , 您可能感興趣的文章:
領導人怎樣帶領好團隊
構建創業公司突擊小團隊
國際化環境下系統架構演化
微服務架構設計
視頻直播平臺的系統架構演化
微服務與Docker介紹
Docker與CI持續集成/CD
互聯網電商購物車架構演變案例
互聯網業務場景下消息隊列架構
互聯網高效研發團隊管理演進之一
消息系統架構設計演進
互聯網電商搜索架構演化之一
企業信息化與軟件工程的迷思
企業項目化管理介紹
軟件項目成功之要素
人際溝通風格介紹一
精益IT組織與分享式領導
學習型組織與企業
企業創新文化與等級觀念
組織目標與個人目標
初創公司人才招聘與管理
人才公司環境與企業文化
企業文化、團隊文化與知識共享
高效能的團隊建設
項目管理溝通計劃
構建高效的研發與自動化運維
某大型電商雲平臺實踐
互聯網數據庫架構設計思路
IT基礎架構規劃方案一(網絡系統規劃)
餐飲行業解決方案之客戶分析流程
餐飲行業解決方案之採購戰略制定與實施流程
餐飲行業解決方案之業務設計流程
供應鏈需求調研CheckList
企業應用之性能實時度量系統演變

如有想了解更多軟件設計與架構, 系統IT,企業信息化, 團隊管理 資訊,請關注我的微信訂閱號:

MegadotnetMicroMsg_thumb1_thumb1_thu[2]

作者:Petter Liu
出處:http://www.cnblogs.com/wintersun/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。 該文章也同時發佈在我的獨立博客中-Petter Liu Blog。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章