還在使用第三方Docker插件?SpringBoot官方插件真香!
為了方便為SpringBoot應(yīng)用構(gòu)建Docker鏡像,我們經(jīng)常會(huì)使用Maven插件來打包鏡像。之前一直使用的是第三方插件,有
spotify和fabric8出品的兩種docker-maven-plugin。最近SpringBoot 2.4.0發(fā)布了,官方插件也增加了對(duì)Docker的支持,體驗(yàn)了一把發(fā)現(xiàn)也很好用,推薦給大家!
第三方插件使用
我們先了解下第三方插件的使用,方便和官方插件做對(duì)比,
fabric8插件使用具體可以參考《還在手動(dòng)部署SpringBoot應(yīng)用?試試這個(gè)自動(dòng)化插件!》。
值得注意的是,在我們使用插件時(shí),需要自己定義鏡像構(gòu)建過程,比如在 pom.xml中使用如下配置,<images>標(biāo)簽下的配置為鏡像構(gòu)建過程的配置;
<build>
<plugins>
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.33.0</version>
<configuration>
<!-- Docker 遠(yuǎn)程管理地址-->
<dockerHost>http://192.168.3.101:2375</dockerHost>
<!-- Docker 推送鏡像倉(cāng)庫(kù)地址-->
<pushRegistry>http://192.168.3.101:5000</pushRegistry>
<images>
<image>
<!--由于推送到私有鏡像倉(cāng)庫(kù),鏡像名需要添加倉(cāng)庫(kù)地址-->
<name>192.168.3.101:5000/mall-tiny/${project.name}:${project.version}</name>
<!--定義鏡像構(gòu)建行為-->
<build>
<!--定義基礎(chǔ)鏡像-->
<from>java:8</from>
<args>
<JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
</args>
<!--定義哪些文件拷貝到容器中-->
<assembly>
<!--定義拷貝到容器的目錄-->
<targetDir>/</targetDir>
<!--只拷貝生成的jar包-->
<descriptorRef>artifact</descriptorRef>
</assembly>
<!--定義容器啟動(dòng)命令-->
<entryPoint>["java", "-jar","/${project.build.finalName}.jar"]</entryPoint>
<!--定義維護(hù)者-->
<maintainer>macrozheng</maintainer>
</build>
</image>
</images>
</configuration>
</plugin>
</plugins>
</build>
或者先在Dockerfile文件中定義好鏡像構(gòu)建過程;
# 該鏡像需要依賴的基礎(chǔ)鏡像
FROM java:8
# 將當(dāng)前maven目錄生成的文件復(fù)制到docker容器的/目錄下
COPY maven /
# 聲明服務(wù)運(yùn)行在8080端口
EXPOSE 8080
# 指定docker容器啟動(dòng)時(shí)運(yùn)行jar包
ENTRYPOINT ["java", "-jar","/mall-tiny-fabric-0.0.1-SNAPSHOT.jar"]
# 指定維護(hù)者的名字
MAINTAINER macrozheng
然后在插件中引用Dockerfile文件,用于構(gòu)建鏡像;
<build>
<dockerFileDir>${project.basedir}</dockerFileDir>
</build>
其實(shí)對(duì)于SpringBoot應(yīng)用來說,如何從應(yīng)用Jar包構(gòu)建Docker鏡像,做法基本是差不多的,為什么非要自己定義鏡像的構(gòu)建過程呢?
官方插件使用
SpringBoot官方插件解決了上面的問題,無需自己編寫Docker鏡像構(gòu)建過程,直接自動(dòng)構(gòu)建,是不是很方便!接下來我們來體驗(yàn)下它的強(qiáng)大之處!
由于我們需要把鏡像推送到鏡像倉(cāng)庫(kù),首先我們安裝好私有鏡像倉(cāng)庫(kù) Registry和可視化鏡像管理工具docker-registry-ui,具體可以參考《還在手動(dòng)部署SpringBoot應(yīng)用?試試這個(gè)自動(dòng)化插件!》;
[root@linux-local ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9ffec08467ac joxit/docker-registry-ui:static "/bin/sh -c entrypoi…" 2 hours ago Up 2 hours 0.0.0.0:8280->80/tcp registry-ui
a809535ee2a2 registry:2 "/entrypoint.sh /etc…" 3 months ago Up 7 hours 0.0.0.0:5000->5000/tcp registry2
然后我們需要把應(yīng)用的版本升級(jí)到SpringBoot 2.4.0,之前的版本Docker支持沒有這個(gè)完善;
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
然后修改 pom.xml文件,對(duì)官方Maven插件進(jìn)行配置,主要是對(duì)Docker相關(guān)功能進(jìn)行配置;
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<image>
<!--配置鏡像名稱-->
<name>192.168.3.101:5000/mall-tiny/${project.name}:${project.version}</name>
<!--鏡像打包完成后自動(dòng)推送到鏡像倉(cāng)庫(kù)-->
<publish>true</publish>
</image>
<docker>
<!--Docker遠(yuǎn)程管理地址-->
<host>http://192.168.3.101:2375</host>
<!--不使用TLS訪問-->
<tlsVerify>false</tlsVerify>
<!--Docker推送鏡像倉(cāng)庫(kù)配置-->
<publishRegistry>
<!--推送鏡像倉(cāng)庫(kù)用戶名-->
<username>test</username>
<!--推送鏡像倉(cāng)庫(kù)密碼-->
<password>test</password>
<!--推送鏡像倉(cāng)庫(kù)地址-->
<url>http://192.168.3.101:5000</url>
</publishRegistry>
</docker>
</configuration>
</plugin>
如果你使用的是IDEA的話,直接雙擊SpringBoot插件的 build-image命令即可一鍵打包并推送到鏡像倉(cāng)庫(kù);

也可以在命令行使用如下Maven命令來打包構(gòu)建鏡像;
mvn spring-boot:build-image
鏡像構(gòu)建過程中會(huì)輸出如下信息,由于很多依賴會(huì)從Github上下載,網(wǎng)絡(luò)不好的情況下會(huì)下載失敗,多試幾次就好:
[INFO] > Pulling builder image 'docker.io/paketobuildpacks/builder:base' 100%
[INFO] > Pulled builder image 'paketobuildpacks/builder@sha256:9d377230ba8ee74d8619178fd318b1b87a7da1a88bdb198afd14dd7de9e8ea6a'
[INFO] > Pulling run image 'docker.io/paketobuildpacks/run:base-cnb' 100%
[INFO] > Pulled run image 'paketobuildpacks/run@sha256:33d37fc9ba16e220f071805eaeed881a508ceee5c8909db5710aaed7e97e4fc2'
[INFO] > Executing lifecycle version v0.9.3
[INFO] > Using build cache volume 'pack-cache-5641f846df6.build'
[INFO]
[INFO] > Running creator
[INFO] [creator] ===> DETECTING
[INFO] [creator] 5 of 18 buildpacks participating
[INFO] [creator] paketo-buildpacks/ca-certificates 1.0.1
[INFO] [creator] paketo-buildpacks/bellsoft-liberica 5.2.1
[INFO] [creator] paketo-buildpacks/executable-jar 3.1.3
[INFO] [creator] paketo-buildpacks/dist-zip 2.2.2
[INFO] [creator] paketo-buildpacks/spring-boot 3.5.0
[INFO] [creator] ===> ANALYZING
[INFO] [creator] Restoring metadata for "paketo-buildpacks/ca-certificates:helper" from app image
[INFO] [creator] Restoring metadata for "paketo-buildpacks/bellsoft-liberica:helper" from app image
[INFO] [creator] Restoring metadata for "paketo-buildpacks/bellsoft-liberica:java-security-properties" from app image
[INFO] [creator] Restoring metadata for "paketo-buildpacks/bellsoft-liberica:jre" from app image
[INFO] [creator] Restoring metadata for "paketo-buildpacks/bellsoft-liberica:jvmkill" from app image
[INFO] [creator] Restoring metadata for "paketo-buildpacks/executable-jar:class-path" from app image
[INFO] [creator] Restoring metadata for "paketo-buildpacks/spring-boot:helper" from app image
[INFO] [creator] Restoring metadata for "paketo-buildpacks/spring-boot:spring-cloud-bindings" from app image
[INFO] [creator] Restoring metadata for "paketo-buildpacks/spring-boot:web-application-type" from app image
[INFO] [creator] ===> RESTORING
[INFO] [creator] ===> BUILDING
[INFO] [creator]
[INFO] [creator] Paketo CA Certificates Buildpack 1.0.1
[INFO] [creator] https://github.com/paketo-buildpacks/ca-certificates
[INFO] [creator] Launch Helper: Reusing cached layer
[INFO] [creator]
[INFO] [creator] Paketo BellSoft Liberica Buildpack 5.2.1
[INFO] [creator] https://github.com/paketo-buildpacks/bellsoft-liberica
[INFO] [creator] Build Configuration:
[INFO] [creator] $BP_JVM_VERSION 8.* the Java version
[INFO] [creator] Launch Configuration:
[INFO] [creator] $BPL_JVM_HEAD_ROOM 0 the headroom in memory calculation
[INFO] [creator] $BPL_JVM_LOADED_CLASS_COUNT 35% of classes the number of loaded classes in memory calculation
[INFO] [creator] $BPL_JVM_THREAD_COUNT 250 the number of threads in memory calculation
[INFO] [creator] $JAVA_TOOL_OPTIONS the JVM launch flags
[INFO] [creator] BellSoft Liberica JRE 8.0.275: Reusing cached layer
[INFO] [creator] Launch Helper: Reusing cached layer
[INFO] [creator] JVMKill Agent 1.16.0: Reusing cached layer
[INFO] [creator] Java Security Properties: Reusing cached layer
[INFO] [creator]
[INFO] [creator] Paketo Executable JAR Buildpack 3.1.3
[INFO] [creator] https://github.com/paketo-buildpacks/executable-jar
[INFO] [creator] Process types:
[INFO] [creator] executable-jar: java org.springframework.boot.loader.JarLauncher
[INFO] [creator] task: java org.springframework.boot.loader.JarLauncher
[INFO] [creator] web: java org.springframework.boot.loader.JarLauncher
[INFO] [creator]
[INFO] [creator] Paketo Spring Boot Buildpack 3.5.0
[INFO] [creator] https://github.com/paketo-buildpacks/spring-boot
[INFO] [creator] Creating slices from layers index
[INFO] [creator] dependencies
[INFO] [creator] spring-boot-loader
[INFO] [creator] snapshot-dependencies
[INFO] [creator] application
[INFO] [creator] Launch Helper: Reusing cached layer
[INFO] [creator] Web Application Type: Contributing to layer
[INFO] [creator] Servlet web application detected
[INFO] [creator] Writing env.launch/BPL_JVM_THREAD_COUNT.default
[INFO] [creator] Spring Cloud Bindings 1.7.0: Reusing cached layer
[INFO] [creator] 4 application slices
[INFO] [creator] Image labels:
[INFO] [creator] org.opencontainers.image.title
[INFO] [creator] org.opencontainers.image.version
[INFO] [creator] org.springframework.boot.spring-configuration-metadata.json
[INFO] [creator] org.springframework.boot.version
[INFO] [creator] ===> EXPORTING
[INFO] [creator] Reusing layer 'paketo-buildpacks/ca-certificates:helper'
[INFO] [creator] Reusing layer 'paketo-buildpacks/bellsoft-liberica:helper'
[INFO] [creator] Reusing layer 'paketo-buildpacks/bellsoft-liberica:java-security-properties'
[INFO] [creator] Reusing layer 'paketo-buildpacks/bellsoft-liberica:jre'
[INFO] [creator] Reusing layer 'paketo-buildpacks/bellsoft-liberica:jvmkill'
[INFO] [creator] Reusing layer 'paketo-buildpacks/executable-jar:class-path'
[INFO] [creator] Reusing layer 'paketo-buildpacks/spring-boot:helper'
[INFO] [creator] Reusing layer 'paketo-buildpacks/spring-boot:spring-cloud-bindings'
[INFO] [creator] Reusing layer 'paketo-buildpacks/spring-boot:web-application-type'
[INFO] [creator] Reusing 4/5 app layer(s)
[INFO] [creator] Adding 1/5 app layer(s)
[INFO] [creator] Reusing layer 'launcher'
[INFO] [creator] Reusing layer 'config'
[INFO] [creator] Reusing layer 'process-types'
[INFO] [creator] Adding label 'io.buildpacks.lifecycle.metadata'
[INFO] [creator] Adding label 'io.buildpacks.build.metadata'
[INFO] [creator] Adding label 'io.buildpacks.project.metadata'
[INFO] [creator] Adding label 'org.opencontainers.image.title'
[INFO] [creator] Adding label 'org.opencontainers.image.version'
[INFO] [creator] Adding label 'org.springframework.boot.spring-configuration-metadata.json'
[INFO] [creator] Adding label 'org.springframework.boot.version'
[INFO] [creator] Setting default process type 'web'
[INFO] [creator] *** Images (d5e1771dac7b):
[INFO] [creator] 192.168.3.101:5000/mall-tiny/mall-tiny-docker-plugin:0.0.1-SNAPSHOT
[INFO]
[INFO] Successfully built image '192.168.3.101:5000/mall-tiny/mall-tiny-docker-plugin:0.0.1-SNAPSHOT'
[INFO]
[INFO] > Pushed image '192.168.3.101:5000/mall-tiny/mall-tiny-docker-plugin:0.0.1-SNAPSHOT'
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:06 min
[INFO] Finished at: 2020-11-27T15:07:46+08:00
[INFO] Final Memory: 37M/359M
[INFO] ------------------------------------------------------------------------
鏡像構(gòu)建成功后,可以從鏡像倉(cāng)庫(kù)查看到我們的鏡像:
[root@linux-local ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
paketobuildpacks/run base-cnb a717358311fc 9 days ago 87.2MB
java 8 d23bdf5b1b1b 3 years ago 643MB
192.168.3.101:5000/mall-tiny/mall-tiny-docker-plugin 0.0.1-SNAPSHOT d5e1771dac7b 40 years ago 244MB
pack.local/builder/fewqajyqsc latest f15fad05a5ba 40 years ago 558MB
pack.local/builder/kirivtcqtu latest f15fad05a5ba 40 years ago 558MB
paketobuildpacks/builder base 511452064e06 40 years ago 558MB
我們可以從 Docker Registry UI中查看鏡像倉(cāng)庫(kù)中的鏡像,訪問地址:http://192.168.3.101:8280/

接著使用如下命令啟動(dòng)我們的SpringBoot應(yīng)用:
docker run -p 8080:8080 --name mall-tiny-docker-plugin \
--link mysql:db \
-v /etc/localtime:/etc/localtime \
-v /mydata/app/mall-tiny-docker-plugin/logs:/var/logs \
-d 192.168.3.101:5000/mall-tiny/mall-tiny-docker-plugin:0.0.1-SNAPSHOT
啟動(dòng)成功后,可以成功訪問到SpringBoot應(yīng)用的Swagger頁(yè)面,訪問地址:http://192.168.3.101:8080/swagger-ui.html

總結(jié)
SpringBoot官方Maven插件避免了編寫Docker鏡像構(gòu)建過程,同時(shí)充分利用了SpringBoot 2.3以后的Jar分層技術(shù),但對(duì)于需要自定義構(gòu)建鏡像的場(chǎng)景造成了一定的麻煩。
參考資料
官方文檔:https://docs.spring.io/spring-boot/docs/2.4.0/maven-plugin/reference/htmlsingle/#build-image
項(xiàng)目源碼地址
https://github.com/macrozheng/mall-learning/tree/master/mall-tiny-docker-plugin
-- end --
喜歡就三連呀
關(guān)注 Stephen,一起學(xué)習(xí),一起成長(zhǎng)。
