詳解SpringBoot(2.3)應用製做Docker鏡像(官方方案)

關於《SpringBoot-2.3容器化技術》系列

《SpringBoot-2.3容器化技術》系列,旨在和你們一塊兒學習實踐2.3版本帶來的最新容器化技術,讓我們的Java應用更加適應容器化環境,在雲計算時代依舊緊跟主流,保持競爭力;java

全系列文章分爲主題和輔助兩部分,主題部分以下:git

  1. 《體驗SpringBoot(2.3)應用製做Docker鏡像(官方方案)》
  2. 《詳解SpringBoot(2.3)應用製做Docker鏡像(官方方案)》
  3. 《掌握SpringBoot-2.3的容器探針:基礎篇》
  4. 《掌握SpringBoot-2.3的容器探針:深刻篇》
  5. 《掌握SpringBoot-2.3的容器探針:實戰篇》

輔助部分是一些參考資料和備忘總結,以下:程序員

  1. 《SpringBoot-2.3鏡像方案爲何要作多個layer》
  2. 《設置非root帳號不用sudo直接執行docker命令》
  3. 《開發階段,將SpringBoot應用快速部署到K8S》

本篇簡介

前文,我們快速體驗了官方推薦的docker鏡像製做方案,但也產生了幾個疑問:github

  1. SpringBoot-2.3版本推薦的鏡像構建方案和舊版本比有什麼不一樣?
  2. pom.xml中<font color="blue">spring-boot-maven-plugin</font>插件新增的參數,到底作了什麼?
  3. Dockerfile中,<font color="blue">java -Djarmode=layertools -jar application.jar extract</font>這個操做啥意思?

本篇的目標就是解答上述問題,在尋找答案的過程當中不斷補全知識點,提高本身;spring

關鍵知識點:鏡像layer

前文屢次提到的鏡像layer究竟是什麼,爲何會有多層layer?有必要先把這個知識點夯實了,請參考文章《SpringBoot-2.3鏡像方案爲何要作多個layer》docker

老版本SpringBoot的官方方案

以<font color="blue">SpringBoot-2.2.0.RELEASE</font>版本爲例,官方文檔(
https://docs.spring.io/spring...shell

  1. 將SpringBoot工程編譯構建,在target目錄獲得jar;
  2. 在target目錄新建dependency文件夾;
  3. 將jar解壓到dependency文件夾;
  4. 編寫Dockerfile文件,內容以下:
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG DEPENDENCY=target/dependency
COPY ${DEPENDENCY}/BOOT-INF/lib /app/lib
COPY ${DEPENDENCY}/META-INF /app/META-INF
COPY ${DEPENDENCY}/BOOT-INF/classes /app
ENTRYPOINT ["java","-cp","app:app/lib/*","com.example.MyApplication"]
  1. 可見,官方推薦的作法是將整個jar文件解壓,在Dockerfile中屢次用COPY命令分別複製,這樣作的好處顯而易見:多個layer,若是鏡像的新版本中只修改了應用代碼,那麼下載鏡像時只會下載/app這個layer,其餘部分直接使用本地緩存,這是docker鏡像的常規優化手段;
  2. 上述方案有個小問題:<font color="red">麻煩!!!</font>
  3. 因而2.3.0.RELEASE版本作了些優化,讓事情變得簡單些;

2.3.0.RELEASE版本方案和舊版的區別

2.3.0.RELEASE版本構建Docker的步驟以下:緩存

  1. pom.xml中的spring-boot-maven-plugin插件增長一個配置項;

2.編譯構建生成jar;app

  1. 編寫Dockerfile,裏面用到了多階段構建(multi-stage builds),用工具從jar中提取拆分後,再屢次執行COPY命令將拆分後的內容放入鏡像,達到多個layer的目的;

所以,2.3.0.RELEASE版本和舊版本相比有以下變化:maven

  1. <font color="blue">pom.xml</font>中多了個參數;
  2. 構建好jar後,無需本身解壓jar;
  3. Dockefile內容不同,舊版是手動解壓jar,再在Dockerfile分別複製,2.3.0.RELEASE是經過<font color="red">java命令從jar中提取出各部份內容</font>;

搞清楚了新舊版本的區別,我們繼續研究下一個問題吧;

pom.xml中spring-boot-maven-plugin插件新增的參數

  1. pring-boot-maven-plugin插件新增參數以下圖所示:

在這裏插入圖片描述

  1. 上述參數有啥用?我這邊編譯構建了兩次jar,第一次有上述參數,第二次沒有,將兩次生成的jar解壓後對比,發現用了上述參數後,生成的jar會多出下圖紅框中的兩個文件:

在這裏插入圖片描述

  1. 看看<font color="blue">layers.idx</font>文件的內容,以下圖:

在這裏插入圖片描述

  1. 上圖中的內容分別是什麼意思呢?官方已給出了詳細解釋,以下圖紅框:

在這裏插入圖片描述

  1. 綜上所述,layers.idx文件是個清單,裏面記錄了全部要被複制到鏡像中的信息,接下來看看如何使用layers.idx文件,這就涉及到jar包中新增的另外一個文件:<font color="blue">spring-boot-jarmode-layertools-2.3.0.RELEASE.jar</font>

spring-boot-jarmode-layertools工具

  1. 前面已經介紹過jar中除了layers.idx,還多了個文件:<font color="blue">spring-boot-jarmode-layertools-2.3.0.RELEASE.jar</font> ,來看看這個文件的用處;
  2. 進入工程的<font color="blue">target</font>目錄,這裏面是編譯後的jar文件(我這裏文件名爲dockerlayerdemo-0.0.1-SNAPSHOT.jar),注意此時的<font color="blue">spring-boot-maven-plugin</font>插件是帶上了下圖紅框中的參數的:

在這裏插入圖片描述

  1. 執行如下命令:
java -Djarmode=layertools -jar dockerlayerdemo-0.0.1-SNAPSHOT.jar list
  1. 獲得結果以下圖所示,是layers.idx文件的內容:

在這裏插入圖片描述

  1. 來看看官方對這個<font color="blue">layertools</font>的解釋,list參數的做用上面咱們已經體驗過了,重點是紅框中的<font color="red">extract</font>參數,它的做用是從jar中提取構建鏡像所需的內容:

在這裏插入圖片描述

  1. 看到這裏,您是否想到了《體驗SpringBoot(2.3)應用製做Docker鏡像(官方方案)》中Dockerfile的內容,請看下圖的紅框和紅字,是否有種恍然大悟的感受:jar構建生成清單layers.idx,Dockerfile中根據清單從jar提取文件放入鏡像:

在這裏插入圖片描述

至此,三個問題都已經找到了答案,小結一下:

SpringBoot-2.3.0.RELEASE推薦的鏡像構建方案和舊版本相比有什麼不一樣

  1. pom.xml中的spring-boot-maven-plugin插件增長一個配置項;
  2. 構建好jar後,舊版本要本身解壓jar,新版不須要;
  3. 新版本的jar中,多了個文件清單<font color="blue">layers.idx</font>和鏡像文件處理工具<font color="blue">spring-boot-jarmode-layertools-2.3.0.RELEASE.jar</font>;
  4. 舊版的Dockefile內容:由於前面解壓好了,全部在Dockerfile裏直接複製前面解壓的內容,這裏就有個風險:前一步解壓和當前複製的文件位置要保證一致;
  5. 新版的Dockerfile內容:使用工具spring-boot-jarmode-layertools-2.3.0.RELEASE.jar,根據的layers.idx內容從jar中提取文件,複製到鏡像中;
  6. 新版的Dockerfile中,因爲使用了分階段構建,所以從jar提取文件的操做不會保存到鏡像的layer中;

pom.xml中spring-boot-maven-plugin插件新增的參數,到底作了什麼

spring-boot-maven-plugin插件新增的參數,使得編譯構建獲得jar中多了兩個文件,以下圖所示:

在這裏插入圖片描述

Dockerfile中,java -Djarmode=layertools -jar application.jar extract這個操做啥意思

  1. <font color="blue">java -Djarmode=layertools -jar application.jar extract</font>的做用是從jar中提取文件,這些文件是docker鏡像的一部分;
  2. 上述操做的參數是<font color="blue">extract</font>,另外還有兩個參數,官方解釋它們的做用以下:

在這裏插入圖片描述

至此,問題已所有澄清,相信您對SpringBoot-2.3.0.RELEASE官方的鏡像構建方案也足夠了解了,最後是我根據本身的認識畫的流程圖,幫助您快速理解整個構建流程:

在這裏插入圖片描述

歡迎訪問個人GitHub

歡迎關注個人公衆號:程序員欣宸

在這裏插入圖片描述

https://github.com/zq2599/blog_demos

相關文章
相關標籤/搜索