SpringBoot 打包成Docker專案
一. 準備工作
idea 安裝docker外掛
進入到Idea-Preferences-Plugin-搜尋docker 點選Install 下載安裝成功後 重啟Idea。
idea配置docker
進入到Idea-Preferences-Build...Docker 配置docker
Engine API URL填寫docker的IP:2375即可(mac需要修改)
***配置docker地址的時候需要注意,遠端地址與本地地址都可以配置,但是後面建立docker映象時筆者遇到了很多問題,試了很多次才成功
筆者下面介紹自己成功的兩個案例。
***總結來看就是本地docker用dockerfile-maven-plugin容易成功
遠端docker用docker-maven-plugin容易成功,其他的總是出各種錯,由於能力,時間有限只成功了這兩種。
本地mac安裝配置docker
請點選以下連結下載Stable或Edge版本的 Docker for Mac。
如同 macOS 其它軟體一樣,安裝也非常簡單,雙擊下載的 .dmg 檔案,然後將鯨魚圖示拖拽到 Application 資料夾即可。
配置映象加速
設定docker外部訪問
外部訪問docker需要連結2375埠,由於mac本2375埠沒法直接連結,所以需要執行一個容器來開通外部訪問
docker run -d -v /var/run/docker.sock:/var/run/docker.sock -p 127.0.0.1:1234:1234 bobrik/socat TCP-LISTEN:1234,fork UNIX-CONNECT:/var/run/docker.sock
然後執行
export DOCKER_HOST=tcp://localhost:1234
遠端安裝配置docker
配置Docker,開啟遠端訪問(例:aliyun伺服器)
(注:僅供學習參考,實際生產環境萬萬不可,會產生很大的安全風險),預設埠是2375,也可以修改為其他埠
1、修改/lib/systemd/system/docker.service檔案
vim /lib/systemd/system/docker.service在ExecStart
後面追加-H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
2、重新載入配置檔案,重啟docker,使得剛才的配置生效
#重新載入配置檔案 systemctl daemon-reload #重啟docker服務 systemctl restart docker
這樣就完成了準備工作,這些準備工作基本不會出什麼錯誤
二. 本地mac建立映象
pom檔案配置
dockerfile-maven-plugin
將 SpringBoot 專案打包成 Docker 映象,其主要通過 Maven plugin 外掛來進行構建。
接下來就看一下plugin外掛的配置和操作
<plugin> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-plugin</artifactId> <version>1.4.13</version> <configuration> <repository>com.uu.${project.artifactId}</repository> <tag>${project.version}</tag> <buildArgs> <JAR_FILE>${project.build.finalName}.jar</JAR_FILE> </buildArgs> </configuration> </plugin>
因為我是自己測試,為了可以手動控制就沒有在install階段就建立映象,所以plugin配置稍微簡單一些,如果像實現自動,可以新增下面的配置
<executions> <execution> <id>default</id>
<phase>install</phase> <goals> <goal>build</goal> <goal>push</goal> </goals> </execution>
</executions>
引數說明:
- repository:指定Docker映象的repository名字,要展示在docker images 中的。
- tag:指定Docker映象的tag,不指定tag預設為latest
- buildArgs:指定一個或多個變數,傳遞給Dockerfile,在Dockerfile中通過ARG指令進行引用。
- JAR_FILE 指定 jar 檔名。
- goal:繫結dockerfile的build與push到maven階段
- phase: 設定要繫結的階段,例如package,install
點選圖上的操作就可以自己手動來控制了,測試的時候更方便
Dockerfile
#設定映象基礎,jdk8 FROM java:8 #設定映象對外暴露埠 EXPOSE 8080 #ARG:引用plugin中配置的 JAR_FILE 檔案 ARG JAR_FILE #將當前 target 目錄下的 jar 放置在根目錄下,命名為 app.jar,推薦使用絕對路徑。 ADD target/${JAR_FILE} /app.jar #執行啟動命令 ENTRYPOINT ["java", "-jar","/app.jar"]
引數說明:
- FROM:基於java:8映象構建
- EXPOSE:監聽8080埠
- ARG:引用plugin中配置的 JAR_FILE 檔案
- ADD:將當前 target 目錄下的 jar 放置在根目錄下,命名為 app.jar,推薦使用絕對路徑。
- ENTRYPOINT:執行命令 java -jar /app.jar
Dockerfile檔案一定要放在和pom.xml檔案一起的最外層目錄
自己遇到的一些坑
Failed to execute goal com.spotify:dockerfile-maven-plugin:1.4.13:build (default) on project docker_admin: Missing Dockerfile in context directory:
Dockerfile檔案放錯位置了會報著個錯誤
配置引數裡有個標籤
<dockerfile>/src/main/java/docker</dockerfile>
我把標籤對應上自己放檔案的位置,還是報
Failed to execute goal com.spotify:dockerfile-maven-plugin:1.4.13:build (default) on project docker_admin: Missing Dockerfile at /src/main/java/docker
我發現了一個問題,是不是應該寫全路徑呀,一直弄不明白,工資又泡湯了(*@︿@*﹀
<dockerfile>/Users/jingxc/service/sts-project/uu_boot_admin/src/main/java/docker</dockerfile>
改成這樣子試試(*@ο@*) 哇~ 然而又出現新的問題了
Execution default of goal com.spotify:dockerfile-maven-plugin:1.4.13:build failed: Could not acquire image ID or digest following build -> [Help 1]
太悲催了,這個問題智慧問度娘了,什麼都有,最多的就是修改.dockerignore 檔案內容:可是我沒有配置這個檔案呀,這可咋麼辦呢。。。。。。
還有人說重新裝一遍docker。。。。。
哎,在探索的路上越走越遠了,時間緊迫就不去深鑽了,頭髮都沒幾根了
最後還是放在最外面吧
不過,我測試的時候遇見了檔案放的位置沒問題,pom.xml配置也沒問題,就是報
Execution default of goal com.spotify:dockerfile-maven-plugin:1.4.13:build failed: Could not acquire image ID or digest following build -> [Help 1]
不知道怎麼回事,專案clean,重新整理依賴都不行,應該是Dockerfile出現問題了,但是我查了好多遍都沒問題,就幾行程式碼都快一個一個字看了,最後實在無奈
我只能把Dockerfile檔案刪除了,清空專案重新整理一下,又重新複製進去,就好了,就很神奇。
docker部署
通過命令列:docker run -di --name admin -p 8080:8080com.uu.docker_admin
當然本地有圖形化介面,可以直接啟動
啟動成功,新手村已經攻略,哈哈
三. 遠端aliyun建立映象
新手村已經攻略完成,準備去異界大陸,裝備就先不換了,只需要修改一下,idea外掛地址
進入到Idea-Preferences-Build...Docker 配置docker
嗯?什麼鬼好像有點水土不服,為什麼我配置上遠端的地址還是在我本地生成了映象,一定是有什麼結界,我先把自身的修為散去試試,關掉本地的docker服務試試
Caused by: com.spotify.docker.client.exceptions.DockerException: java.util.concurrent.ExecutionException: com.spotify.docker.client.shaded.javax.ws.rs.ProcessingException: java.io.IOException: Connection refused
連結被拒絕,看樣子還是沒有用到遠端的docker,哎北鼻無奈,只能學習強化技能了
pom檔案配置
利用docker-maven-plugin配置遠端的上傳地址
<plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.0.0</version> <configuration> <!--映象名稱--> <imageName>com.uu.${project.artifactId}</imageName> <!--指定dockerfile路徑--> <!--<dockerDirectory>${project.basedir}/src/main/resources</dockerDirectory>--> <!--指定標籤--> <imageTags> <imageTag>latest</imageTag> </imageTags> <!--遠端倉庫地址--> <!--<registryUrl>123.123.123.123:5000</registryUrl>--> <!--<pushImage>true</pushImage>--> <!--基礎映象jdk1.8--> <baseImage>java:8</baseImage> <!--製作者提供本人資訊--> <maintainer>[email protected]</maintainer> <!--切換到ROOT目錄--> <workdir>/ROOT</workdir> <cmd>["java","-version"]</cmd> <entryPoint>["java","-jar","${project.build.finalName}.jar"]</entryPoint> <!--指定遠端docker地址--> <dockerHost>http://123.123.123.123:2375</dockerHost> <!--這裡是複製jar包到docker容器指定目錄配置--> <resources> <resource> <targetPath>/ROOT</targetPath> <!--指定需要複製的根目錄,${project.build.directory}表示target目錄--> <directory>${project.build.directory}</directory> <!--用於指定需要複製的檔案,${project.build.finalName}.jar表示打包後的jar包檔案--> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin>
打包上傳成功
如果想實現自動化打包,那麼加上下面的配置就可以
<executions> <execution> <id>default</id> <phase>package</phase> <goals> <goal>build</goal> </goals> </execution> </executions>
這裡也有坑
配置檔案裡有配置
<dockerDirectory>${project.basedir}/src/main/resources</dockerDirectory>
用這個配置一下,就用剛才寫好的Dockerfile,又出現問題了。。。。。
[ERROR] Failed to execute goal com.spotify:docker-maven-plugin:1.0.0:build (default-cli) on project docker_test: Exception caught: ADD failed: stat /var/lib/docker/tmp/docker-builder061031577/target: no such file or directory -> [Help 1]
出現這個問題有好多原因:
- 沒有執行maven-package,未建立jar包
- jar包名稱不對
- jar包地址不對
- Dockerfile檔案與jar不在同一目錄下
- 不過上面說的都是基於專案檔案和docker環境在同一臺伺服器上的原因,比如自動化部署的時候,但是現在我的Dockerfile在本地,想部署到遠端
/var/lib/docker/tmp/docker-builder061031577/target這個路徑就太不對了,剛開始的時候一直以為是配置的問題,藏考了一些資料後來最終改成上面的配置
參考連結
https://www.cnblogs.com/niceyoo/p/13796792.html