「Spring Boot 新特性」一鍵構(gòu)建Docker鏡像
背景
在我們開發(fā)過(guò)程中為了支持 Docker 容器化,一般使用 Maven 編譯打包然后生成鏡像,能夠大大提供上線效率,同時(shí)能夠快速動(dòng)態(tài)擴(kuò)容,快速回滾,著實(shí)很方便。docker-maven-plugin 插件就是為了幫助我們?cè)?Maven 工程中,通過(guò)簡(jiǎn)單的配置,自動(dòng)生成鏡像并推送到倉(cāng)庫(kù)中。
spotify 、fabric8
這里主要使用的主要是如下兩種插件
spotify、fabric8, ... -配置通過(guò) xml 定義出 Dockerfile 或者掛載外部 Dockerfile 通過(guò)調(diào)用 Docker remote api 構(gòu)建出鏡像pig 微服務(wù)平臺(tái)[1]所有的容器化都是基于此構(gòu)建
<plugin>
??<groupId>com.spotifygroupId>
??<artifactId>docker-maven-pluginartifactId>
??...??-配置通過(guò)?xml?定義出?Dockerfile?或者掛載外部?Dockerfile
plugin>
<plugin>
??<groupId>io.fabric8groupId>
??<artifactId>docker-maven-pluginartifactId>
???...??-配置通過(guò)?xml?定義出?Dockerfile?或者掛載外部?Dockerfile
plugin>
- 執(zhí)行相應(yīng)的插件周期即可
mvn docker:build && mvn docker:push
jib
項(xiàng)目每次發(fā)布實(shí)際上變更的代碼量不大,尤其依賴的 jar 變動(dòng)的可能性較小,如果使用前兩種插件構(gòu)建鏡像,會(huì)導(dǎo)致每次都全量構(gòu)建,會(huì)導(dǎo)致存儲(chǔ)和帶寬資源浪費(fèi)。
jib 是 Google 于 18 年 7 月發(fā)布的一個(gè)針對(duì) Java 應(yīng)用的構(gòu)建鏡像的工具(支持 Maven 和 Gradle) ,好處是能夠復(fù)用構(gòu)建緩存,能夠加快構(gòu)建,減小傳輸體積
????com.google.cloud.tools
????jib-maven-plugin
mvn?jib:dockerBuild
以上三種方案的問(wèn)題
在實(shí)際開發(fā)過(guò)程中,大部分的 spring boot 項(xiàng)目構(gòu)建 Dockerfile 都是相同,不需要通過(guò)的 XML 或者通過(guò)外掛 Dockerfile 來(lái)重新定義
以上插件需要對(duì) Dockerfile 的定義知識(shí)有相對(duì)的了 對(duì)開發(fā)并不友好
沒(méi)充分理由 Spring Boot 2.3 以后的 Jar 分層技術(shù)。
解決方案
- Spring Boot 2.4[2] 推出了自己的 docker 構(gòu)建工具 整合在原有的
spring-boot-maven-plugin中,只需要配置對(duì)應(yīng)目標(biāo)倉(cāng)庫(kù)和主機(jī)信息即可完成鏡像構(gòu)建。

- 如下配置即可完成上圖中 通過(guò)開發(fā)機(jī)器在不安裝 Docker 的同時(shí),通過(guò)
192.168.0.10的 Docker Remote API 完成鏡像構(gòu)建并發(fā)布到192.168.0.20的鏡像倉(cāng)庫(kù)
?<plugin>
????<groupId>org.springframework.bootgroupId>
????<artifactId>spring-boot-maven-pluginartifactId>
????<configuration>
????????<image>
????????????<name>192.168.0.20/pig4cloud/${project.artifactId}name>
????????????
????????????<publish>truepublish>
????????image>
????????
????????<docker>
???<host>http://192.168.0.10:2375host>
????????????<tlsVerify>falsetlsVerify>
????????????<publishRegistry>
????????????????<username>usernameusername>
????????????????<password>passwordpassword>
????????????????<url>192.168.0.20url>
????????????publishRegistry>
????????docker>
????configuration>
plugin>
- 執(zhí)行以下命令即可完成 鏡像的構(gòu)建和自動(dòng)發(fā)布
mvn?spring-boot:build-image
其他說(shuō)明
docker host 配置不生效
- 如下圖 ① 處配置節(jié)點(diǎn),但是 ② 報(bào)錯(cuò)提示 host 不一致

- 檢查本地是否配置 $DOCKER_HOST 環(huán)境變量,經(jīng)過(guò)閱讀源碼后發(fā)現(xiàn)優(yōu)先讀取此變量。
?>?~?echo?$DOCKER_HOST??????????????????????????????????????????????????11:07:51
tcp://172.17.0.111:2375
網(wǎng)絡(luò)支持
- 截取部分構(gòu)建過(guò)程中的日志,如下需要從 github 下載相關(guān)的依賴 約 100M ,這個(gè)過(guò)程大概率會(huì)失敗。建議通過(guò)配置代理或者使用國(guó)外 ECS 來(lái)解決。
?::?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
參考資料
[1]pig 微服務(wù)平臺(tái): https://gitee.com/log4j/pig
[2]Spring Boot 2.4 Docker: https://docs.spring.io/spring-boot/docs/2.4.0/maven-plugin/reference/htmlsingle/#build-image-example-publish
Spring Boot 2.4.0 正式發(fā)布,全面擁抱云原生
Spring Boot 2.4 全新Cron表達(dá)式處理機(jī)制
點(diǎn)擊原文查看 spring boot 2.4 新特性系列文章
