SpringBoot實戰電商項目mall(40k+star)地址:github.com/macrozheng/…
摘要
為了方便為SpringBoot應用構建Docker鏡像,我們經常會使用Maven插件來打包鏡像。之前一直使用的是第三方插件,有spotify
和fabric8
出品的兩種docker-maven-plugin
。最近SpringBoot 2.4.0發布了,官方插件也增加了對Docker的支持,體驗了一把發現也很好用,推薦給大家!
第三方插件使用
我們先了解下第三方插件的使用,方便和官方插件做對比,fabric8
插件使用具體可以參考《還在手動部署SpringBoot應用?試試這個自動化插件!》。
- 值得注意的是,在我們使用插件時,需要自己定義鏡像構建過程,比如在
pom.xml
中使用如下配置,<images>
標簽下的配置為鏡像構建過程的配置;
<build> <plugins> <plugin> <groupId>io.fabric8</groupId> <artifactId>docker-maven-plugin</artifactId> <version>0.33.0</version> <configuration> <!-- Docker 遠程管理地址--> <dockerHost>http://192.168.3.101:2375</dockerHost> <!-- Docker 推送鏡像倉庫地址--> <pushRegistry>http://192.168.3.101:5000</pushRegistry> <images> <image> <!--由於推送到私有鏡像倉庫,鏡像名需要添加倉庫地址--> <name>192.168.3.101:5000/mall-tiny/${project.name}:${project.version}</name> <!--定義鏡像構建行為--> <build> <!--定義基礎鏡像--> <from>java:8</from> <args> <JAR_FILE>${project.build.finalName}.jar</JAR_FILE> </args> <!--定義哪些文件拷貝到容器中--> <assembly> <!--定義拷貝到容器的目錄--> <targetDir>/</targetDir> <!--只拷貝生成的jar包--> <descriptorRef>artifact</descriptorRef> </assembly> <!--定義容器啟動命令--> <entryPoint>["java", "-jar","/${project.build.finalName}.jar"]</entryPoint> <!--定義維護者--> <maintainer>macrozheng</maintainer> </build> </image> </images> </configuration> </plugin> </plugins> </build> 復制代碼
- 或者先在Dockerfile文件中定義好鏡像構建過程;
# 該鏡像需要依賴的基礎鏡像 FROM java:8 # 將當前maven目錄生成的文件復制到docker容器的/目錄下 COPY maven / # 聲明服務運行在8080端口 EXPOSE 8080 # 指定docker容器啟動時運行jar包 ENTRYPOINT ["java", "-jar","/mall-tiny-fabric-0.0.1-SNAPSHOT.jar"] # 指定維護者的名字 MAINTAINER macrozheng 復制代碼
- 然后在插件中引用Dockerfile文件,用於構建鏡像;
<build> <dockerFileDir>${project.basedir}</dockerFileDir> </build> 復制代碼
- 其實對於SpringBoot應用來說,如何從應用Jar包構建Docker鏡像,做法基本是差不多的,為什么非要自己定義鏡像的構建過程呢?
官方插件使用
SpringBoot官方插件解決了上面的問題,無需自己編寫Docker鏡像構建過程,直接自動構建,是不是很方便!接下來我們來體驗下它的強大之處!
- 由於我們需要把鏡像推送到鏡像倉庫,首先我們安裝好私有鏡像倉庫
Registry
和可視化鏡像管理工具docker-registry-ui
,具體可以參考《還在手動部署SpringBoot應用?試試這個自動化插件!》;
[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 復制代碼
- 然后我們需要把應用的版本升級到SpringBoot 2.4.0,之前的版本Docker支持沒有這個完善;
<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
文件,對官方Maven插件進行配置,主要是對Docker相關功能進行配置;
<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> <!--鏡像打包完成后自動推送到鏡像倉庫--> <publish>true</publish> </image> <docker> <!--Docker遠程管理地址--> <host>http://192.168.3.101:2375</host> <!--不使用TLS訪問--> <tlsVerify>false</tlsVerify> <!--Docker推送鏡像倉庫配置--> <publishRegistry> <!--推送鏡像倉庫用戶名--> <username>test</username> <!--推送鏡像倉庫密碼--> <password>test</password> <!--推送鏡像倉庫地址--> <url>http://192.168.3.101:5000</url> </publishRegistry> </docker> </configuration> </plugin> 復制代碼
- 如果你使用的是IDEA的話,直接雙擊SpringBoot插件的
build-image
命令即可一鍵打包並推送到鏡像倉庫;
- 也可以在命令行使用如下Maven命令來打包構建鏡像;
mvn spring-boot:build-image 復制代碼
- 鏡像構建過程中會輸出如下信息,由於很多依賴會從Github上下載,網絡不好的情況下會下載失敗,多試幾次就好:
[INFO] > Pulling builder image 'http://docker.io/paketobuildpacks/builder:base' 100% [INFO] > Pulled builder image 'paketobuildpacks/builder@sha256:9d377230ba8ee74d8619178fd318b1b87a7da1a88bdb198afd14dd7de9e8ea6a' [INFO] > Pulling run image 'http://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] ------------------------------------------------------------------------ 復制代碼
- 鏡像構建成功后,可以從鏡像倉庫查看到我們的鏡像:
[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
中查看鏡像倉庫中的鏡像,訪問地址:http://192.168.3.101:8280/
- 接着使用如下命令啟動我們的SpringBoot應用:
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 復制代碼
- 啟動成功后,可以成功訪問到SpringBoot應用的Swagger頁面,訪問地址:http://192.168.3.101:8080/swagger-ui.html
總結
SpringBoot官方Maven插件避免了編寫Docker鏡像構建過程,同時充分利用了SpringBoot 2.3以后的Jar分層技術,但對於需要自定義構建鏡像的場景造成了一定的麻煩。
參考資料
官方文檔:https://docs.spring.io/spring-boot/docs/2.4.0/maven-plugin/reference/htmlsingle/#build-image
項目源碼地址
github.com/macrozheng/…
本文 GitHub github.com/macrozheng/… 已經收錄,歡迎大家Star!
作者:MacroZheng
鏈接:https://juejin.cn/post/6904054246207913998
來源:掘金
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處