SpringBoot 構建 Docker 映象的最佳 3 種方式
阿新 • • 發佈:2020-11-17
![](https://upload-images.jianshu.io/upload_images/15462057-d63458dba87d7232?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
本文將介紹3種技術,通過 Maven 把 SpringBoot 應用構建成 Docker 映象。
(1)使用 spring-boot-maven-plugin 內建的 **build-image**.
(2)使用 Google 的 **jib-maven-plugin**。
(3)使用 **dockerfle-maven-plugin**。
### **Spring Boot 應用**
為了方便實踐,需要一個 Spring Boot 專案。
Demo 專案地址:
https://github.com/davelms/medium-articles/tree/master/spring-maven-docker
專案環境:
* Java 11
* Maven 3.6.3
使用 `mvn package` 可以正常構建 jar 包。
也可以正常執行:
```
java -jar target/demo-application-0.0.1-SNAPSHOT.jar
```
測試頁面:
http://localhost:8080/hello
![](https://upload-images.jianshu.io/upload_images/15462057-9a22b1d6209effe6?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
Demo 專案 OK 了,下面就開始實踐構建映象的3個方法。
### **一、Spring Boot maven 外掛 的 build-image**
Spring Boot 預裝了自己的用於構建 Docker 映象的外掛,我們無需進行任何更改,因為它就在 pom.xml 中的 spring-boot-starter-parent。
你不需要寫 Dockerfile,也不用操別的心,plugin 都幫你做了,例如 Spring 建議的安全、記憶體、效能等問題。
只需要簡單的執行:
```
mvn spring-boot:build-image
```
執行完成後會看到成功提示資訊:
![](https://upload-images.jianshu.io/upload_images/15462057-56339753a21fb9fb?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
執行容器測試:
```
docker run -p 9090:8080 -t demo-application:0.0.1-SNAPSHOT
```
注意:這裡對映的本機埠是`9090`。
![](https://upload-images.jianshu.io/upload_images/15462057-07ec8660d1b02543?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
### **二、jib-maven-plugin**
Jib 是一個 Maven 和 Gradle 外掛,用來建立 Docker 映象。
這個外掛有一個非常明顯的特點:**不需要本地安裝 Docker**,這對持續整合是非常方便的,Jib 可以直接推送到指定的 Docker 倉庫。
Jib 同樣也不需要寫 Dockerfile。
使用起來也非常方便,不需要改程式碼,也可以不改動 pom.xml。
只需要執行:
```
mvn compile com.google.cloud.tools:jib-maven-plugin:2.3.0:dockerBuild
```
* mvn compile
是我們很熟悉的 maven 編譯指令。
* com.google.cloud.tools:jib-maven-plugin:2.3.0
指定了使用 Jib 外掛
* dockerBuild
是 Jib 外掛的執行目標,`dockerBuild` 指定了 Jib 使用我們本地安裝的 Docker。
執行完成後會看到成功提示資訊:
![](https://upload-images.jianshu.io/upload_images/15462057-9b927310f9bf6c7c?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
啟動容器測試:
```
docker run -p 9091:8080 -t demo-application:0.0.1-SNAPSHOT
```
注意:這裡對映的本機埠是`9091`。
![](https://upload-images.jianshu.io/upload_images/15462057-0e375b988a2cd58e?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
### **三、dockerfile-maven-plugin**
這個外掛就需要我們寫 Dockerfile 了,Domo 專案中已經準備好了。
Dockerfile 需要放在專案的根目錄下,和 pom.xml 在一起。
![](https://upload-images.jianshu.io/upload_images/15462057-5e7aba3c83a8cbe9?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
然後,需要在 pom.xml 中新增一些配置,以便指定倉庫、tag 標籤,還有上面 Dockerfile 中定義的 `JAR_FILE`。
![](https://upload-images.jianshu.io/upload_images/15462057-7da0e1a7f1b91c3d?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
執行 `mvn package` 時就會自動構建映象了,執行完成後就會看到提示資訊:
![image](https://upload-images.jianshu.io/upload_images/15462057-a3078002303a0fdd?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
執行容器:
```
docker run -p 9092:8080 -t demo-application:0.0.1-SNAPSHOT
```
注意:對映的本機埠是 `9092`。
![](https://upload-images.jianshu.io/upload_images/15462057-d746f478ea7304ba?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
### **小結**
![](https://upload-images.jianshu.io/upload_images/15462057-7e78d0231c32a00a?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
這3個裡面最方便的是 SpringBoot 原生的方式,什麼都不需要自己做,直接就能用。
最有特點的是 Jib,不需要你本地安裝 Docker,可以直接推送到指定的倉庫,而且使用起來也很簡單。
看起來最麻煩的就是 dockerfile-maven-plugin 這個外掛了,需要寫 Dockerfile,還得新增配置,**但是**,實際上他是最好用的,因為前2個與網路環境有關係(你懂的),即使你配置了 Docker 映象,也會報錯,你可以試一下。
### **寫在最後**
歡迎大家關注我的公眾號【**風平浪靜如碼**】,海量Java相關文章,學習資料都會在裡面更新,整理的資料也會放在裡面。
覺得寫的還不錯的就點個贊,加個關注唄!點關注,不迷路,持續更新!!!5