「Spring Boot 新特性」一鍵構(gòu)建Docker鏡像

背景

在我們開發(fā)過程中為了支持 Docker 容器化,一般使用 Maven 編譯打包然后生成鏡像,能夠大大提供上線效率,同時能夠快速動態(tài)擴容,快速回滾,著實很方便。docker-maven-plugin 插件就是為了幫助我們在 Maven 工程中,通過簡單的配置,自動生成鏡像并推送到倉庫中。
spotify 、fabric8
這里主要使用的主要是如下兩種插件 spotify 、fabric8 , ... -配置通過 xml 定義出 Dockerfile 或者掛載外部 Dockerfile 通過調(diào)用 Docker remote api 構(gòu)建出鏡像
pig 微服務(wù)平臺[1]所有的容器化都是基于此構(gòu)建

<plugin>
  <groupId>com.spotify</groupId>
  <artifactId>docker-maven-plugin</artifactId>
  ...  -配置通過 xml 定義出 Dockerfile 或者掛載外部 Dockerfile
</plugin>


<plugin>
  <groupId>io.fabric8</groupId>
  <artifactId>docker-maven-plugin</artifactId>
   ...  -配置通過 xml 定義出 Dockerfile 或者掛載外部 Dockerfile
</plugin>

執(zhí)行相應(yīng)的插件周期即可 mvn docker:build && mvn docker:push
jib
項目每次發(fā)布實際上變更的代碼量不大,尤其依賴的 jar 變動的可能性較小,如果使用前兩種插件構(gòu)建鏡像,會導(dǎo)致每次都全量構(gòu)建,會導(dǎo)致存儲和帶寬資源浪費。
jib 是 Google 于 18 年 7 月發(fā)布的一個針對 Java 應(yīng)用的構(gòu)建鏡像的工具(支持 Maven 和 Gradle) ,好處是能夠復(fù)用構(gòu)建緩存,能夠加快構(gòu)建,減小傳輸體積

<!--配置通過 xml 定義出 Dockerfile ,本質(zhì)上和外掛 Dockerfile 并無區(qū)別-->
<plugin>
    <groupId>com.google.cloud.tools</groupId>
    <artifactId>jib-maven-plugin</artifactId>
</plugin>

mvn jib:dockerBuild

以上三種方案的問題
在實際開發(fā)過程中,大部分的 spring boot 項目構(gòu)建 Dockerfile 都是相同,不需要通過的 XML 或者通過外掛 Dockerfile 來重新定義
以上插件需要對 Dockerfile 的定義知識有相對的了 對開發(fā)并不友好
沒充分理由 Spring Boot 2.3 以后的 Jar 分層技術(shù)。
解決方案

Spring Boot 2.4[2] 推出了自己的 docker 構(gòu)建工具 整合在原有的 spring-boot-maven-plugin 中,只需要配置對應(yīng)目標倉庫和主機信息即可完成鏡像構(gòu)建。


如下配置即可完成上圖中 通過開發(fā)機器在不安裝 Docker 的同時,通過 192.168.0.10 的 Docker Remote API 完成鏡像構(gòu)建并發(fā)布到 192.168.0.20 的鏡像倉庫

 <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <image>
            <name>192.168.0.20/pig4cloud/${project.artifactId}</name>
            <!-- 執(zhí)行完build 自動push -->
            <publish>true</publish>
        </image>
        <!--配置構(gòu)建宿主機信息,本機不用配置-->
        <docker>
   <host>http://192.168.0.10:2375</host>
            <tlsVerify>false</tlsVerify>
            <publishRegistry>
                <username>username</username>
                <password>password</password>
                <url>192.168.0.20</url>
            </publishRegistry>
        </docker>
    </configuration>
</plugin>

執(zhí)行以下命令即可完成 鏡像的構(gòu)建和自動發(fā)布

mvn spring-boot:build-image

其他說明

docker host 配置不生效
如下圖 ① 處配置節(jié)點,但是 ② 報錯提示 host 不一致


檢查本地是否配置 $DOCKER_HOST 環(huán)境變量,經(jīng)過閱讀源碼后發(fā)現(xiàn)優(yōu)先讀取此變量。

?> ~ echo $DOCKER_HOST                                                  11:07:51
tcp://172.17.0.111:2375

網(wǎng)絡(luò)支持
截取部分構(gòu)建過程中的日志,如下需要從 github 下載相關(guān)的依賴 約 100M ,這個過程大概率會失敗。建議通過配置代理或者使用國外 ECS 來解決。

 :: Spring Boot ::                (v2.4.0)
[INFO]  > Running creator
[INFO]     [creator]         Downloading from https://github.com/bell-sw/Liberica/releases/download/8u275+1/bellsoft-jre8u275+1-linux-amd64.tar.gz
[INFO]     [creator]       JVMKill Agent 1.16.0: Contributing to layer
[INFO]     [creator]         Downloading from https://github.com/cloudfoundry/jvmkill/releases/download/v1.16.0.RELEASE/jvmkill-1.16.0-RELEASE.so
[INFO]     [creator]         Downloading from https://repo.spring.io/release/org/springframework/cloud/spring-cloud-bindings/1.6.0/spring-cloud-bindings-1.6.0.jar
[INFO]     [creator]         Verifying checksum
[INFO]     [creator]           192.168.0.20/pig4cloud/demo:latest
[INFO]
[INFO] Successfully built image '192.168.0.20/pig4cloud/demo:latest'
[INFO]  > Pushing image '192.168.0.20/pig4cloud/demo:latest' 100%
[INFO]  > Pushed image '192.168.0.20/pig4cloud/demo:latest'
[INFO] BUILD SUCCESS
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容