成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

擼一擼,Spring Boot 構建Docker鏡像!

開源
隨著越來越多的組織轉向容器和虛擬服務器,Docker正成為軟件開發工作流程中一個更重要的部分。為此,Spring Boot 2.3中最新的功能之中,提供了為Spring Boot應用程序創建 Docker 鏡像的能力。

[[351755]]

隨著越來越多的組織轉向容器和虛擬服務器,Docker正成為軟件開發工作流程中一個更重要的部分。為此,Spring Boot 2.3中最新的功能之中,提供了為Spring Boot應用程序創建 Docker 鏡像的能力。

這篇文章的目的,就是為了給大家介紹如何為 Spring Boot 應用程序創建 Docker 鏡像。

1. 傳統Docker構建

使用Spring Boot 構建 Docker 鏡像的傳統方法是使用 Dockerfile 。下面是一個簡單的例子:

  1. FROM openjdk:8-jdk-alpine 
  2. EXPOSE 8080 
  3. ARG JAR_FILE=target/demo-app-1.0.0.jar 
  4. ADD ${JAR_FILE} app.jar 
  5. ENTRYPOINT ["java","-jar","/app.jar"

然后我們可以使用 docker build 命令來創建 Docker 映像。這對大多數應用程序都很好,但也有一些缺點。

首先,我們使用的是 Spring Boot 創建的 fat jar。這會影響啟動時間,尤其是在集裝箱環境中。我們可以通過添加jar文件的分解內容來節省啟動時間。

其次,Docker鏡像是分層構建的。Spring Boot fat jar 的特性使得所有的應用程序代碼和第三方庫都放在一個層中。這意味著即使只有一行代碼更改,也必須重新構建整個層。

通過在構建之前分解 jar ,應用程序代碼和第三方庫各自獲得自己的層。這樣,我們便可以利用Docker的緩存機制。現在,當某一行代碼被更改時,只需要重新構建相應的層。

考慮到這一點,讓我們看看Spring Boot 如何改進創建Docker鏡像的過程。

2. Buildpacks

BuildPacks 是一種提供框架和應用程序依賴性的工具。

例如,給定一個Spring Boot fat jar,一個buildpack將為我們提供Java運行時。這使我們可以跳過 Dockerfile 并自動獲得一個合理的docker 鏡像。

Spring Boot 包括對 bulidpacks 的Maven和Gradle支持。例如,使用Maven構建時,我們將運行以下命令:

  1. ./mvnw spring-boot:build-image 

我們觀察下一些相關的輸出,看看發生了什么:

  1. [INFO] Building jar: target/demo-0.0.1-SNAPSHOT.jar 
  2. ... 
  3. [INFO] Building image 'docker.io/library/demo:0.0.1-SNAPSHOT' 
  4. ... 
  5. [INFO]  > Pulling builder image 'gcr.io/paketo-buildpacks/builder:base-platform-api-0.3' 100% 
  6. ... 
  7. [INFO]     [creator]     ===> DETECTING 
  8. [INFO]     [creator]     5 of 15 buildpacks participating 
  9. [INFO]     [creator]     paketo-buildpacks/bellsoft-liberica 2.8.1 
  10. [INFO]     [creator]     paketo-buildpacks/executable-jar    1.2.8 
  11. [INFO]     [creator]     paketo-buildpacks/apache-tomcat     1.3.1 
  12. [INFO]     [creator]     paketo-buildpacks/dist-zip          1.3.6 
  13. [INFO]     [creator]     paketo-buildpacks/spring-boot       1.9.1 
  14. ... 
  15. [INFO] Successfully built image 'docker.io/library/demo:0.0.1-SNAPSHOT' 
  16. [INFO] Total time:  44.796 s 

第一行顯示我們構建了標準的 fat jar,與其他典型的maven包一樣。

下一行開始Docker映像構建。然后,看到這個 bulid 拉取了 packeto 構建器。

packeto 是基于云原生 bulidpacks 的實現。它負責分析我們的項目并確定所需的框架和庫。在我們的例子中,它確定我們有一個Spring Boot項目并添加所需的構建包。

最后,我們看到生成的Docker映像和總構建時間。注意,在第一次構建時,花了相當多的時間下載構建包并創建不同的層。

buildpacks 的一大特點是Docker映像是多層的。因此,如果我們只更改應用程序代碼,后續構建將更快:

  1. ... 
  2. [INFO]     [creator]     Reusing layer 'paketo-buildpacks/executable-jar:class-path' 
  3. [INFO]     [creator]     Reusing layer 'paketo-buildpacks/spring-boot:web-application-type' 
  4. ... 
  5. [INFO] Successfully built image 'docker.io/library/demo:0.0.1-SNAPSHOT' 
  6. ... 
  7. [INFO] Total time:  10.591 s 

3. 層級jar包

在某些情況下,我們可能不喜歡使用 bulidpacks ——也許我們的基礎架構已經綁定到另一個工具上,或者我們已經有了我們想要重新使用的自定義 Dockerfiles 。

基于這些原因,Spring Boot 還支持使用分層jars 構建Docker映像。為了了解它的工作原理,讓我們看看一個典型的Spring Boot fat jar 布局:

  1. org/ 
  2.   springframework/ 
  3.     boot/ 
  4.   loader/ 
  5. ... 
  6. BOOT-INF/ 
  7.   classes/ 
  8. ... 
  9. lib/ 
  10. ... 

fat jar 由3個主要區域組成:

  • 啟動Spring應用程序所需的引導類
  • 應用程序代碼
  • 第三方庫

使用分層jar,結構看起來很相似,但是我們得到了一個新的 layers.idx 將 fat jar 中的每個目錄映射到一個層的文件:

  1. "dependencies"
  2.   - "BOOT-INF/lib/" 
  3. "spring-boot-loader"
  4.   - "org/" 
  5. "snapshot-dependencies"
  6. "application"
  7.   - "BOOT-INF/classes/" 
  8.   - "BOOT-INF/classpath.idx" 
  9.   - "BOOT-INF/layers.idx" 
  10.   - "META-INF/" 

Out-of-the-box, Spring Boot provides four layers:

開箱即用,Spring Boot 提供4層:

  • dependencies: 來自第三方的依賴
  • snapshot-dependencies: 來自第三方的 snapshot 依賴
  • resources: 靜態資源
  • application: 應用程序代碼和資源(resources)

我們的目標是將應用程序代碼和第三方庫放置到層中,以反映它們更改的頻率。

例如,應用程序代碼可能是更改最頻繁的代碼,因此它有自己的層。此外,每一層都可以獨立演化,只有當一層發生變化時,才會為它重建 Docker 鏡像。

現在我們了解了分層 jar 結構,接下來看看如何利用它來制作 Docker 映像。

3.1.創建分層 jar

首先,我們必須建立一個項目來創建一個分層的jar。對于Maven,則需要在POM的 Spring Boot plugin 部分添加一個新的配置:

  1. <plugin> 
  2.     <groupId>org.springframework.boot</groupId> 
  3.     <artifactId>spring-boot-maven-plugin</artifactId> 
  4.     <configuration> 
  5.         <layers> 
  6.             <enabled>true</enabled> 
  7.         </layers> 
  8.     </configuration> 
  9. </plugin> 

有了這個配置,Maven package 命令(包括它的其他依賴命令)將使用前面提到的四個默認層生成一個新的分層jar。

3.2. 查看和提取分層

下一步,我們需要從 jar 中提取層,這樣Docker鏡像才能擁有正確的層。要檢查分層jar的任何層,可以運行以下命令:

  1. java -Djarmode=layertools -jar demo-0.0.1.jar list 

然后提取它們,運行命令:

  1. java -Djarmode=layertools -jar demo-0.0.1.jar extract 

3.3. 創建Docker映像

將這些層合并到 Docker 映像中的最簡單方法是使用 Dockerfile :

  1. FROM adoptopenjdk:11-jre-hotspot as builder 
  2. ARG JAR_FILE=target/*.jar 
  3. COPY ${JAR_FILE} application.jar 
  4. RUN java -Djarmode=layertools -jar application.jar extract 
  5.   
  6. FROM adoptopenjdk:11-jre-hotspot 
  7. COPY --from=builder dependencies/ ./ 
  8. COPY --from=builder snapshot-dependencies/ ./ 
  9. COPY --from=builder spring-boot-loader/ ./ 
  10. COPY --from=builder application/ ./ 
  11. ENTRYPOINT ["java""org.springframework.boot.loader.JarLauncher"

這個 Dockerfile 從fat jar中提取層,然后將每個層復制到Docker映像中。

每個COPY指令最終都會在Docker映像中生成一個新層。

如果我們構建這個Dockerfile,我們可以看到分層jar中的每個層都作為自己的層添加到Docker鏡像中:

  1. ... 
  2. Step 6/10 : COPY --from=builder dependencies/ ./ 
  3.  ---> 2c631b8f9993 
  4. Step 7/10 : COPY --from=builder snapshot-dependencies/ ./ 
  5.  ---> 26e8ceb86b7d 
  6. Step 8/10 : COPY --from=builder spring-boot-loader/ ./ 
  7.  ---> 6dd9eaddad7f 
  8. Step 9/10 : COPY --from=builder application/ ./ 
  9.  ---> dc80cc00a655 
  10. ... 

在本文中,我們學習了使用 Spring Boot 構建 Docker 映像的各種方法。

使用 buildpacks,我們可以獲得合適的Docker鏡像,而無需模板或自定義配置。

或者,再多花點功夫,我們就可以使用分層 jar 來獲得一個更加定制的Docker鏡像。

本文轉載自微信公眾號「鍋外的大佬」,可以通過以下二維碼關注。轉載本文請聯系鍋外的大佬公眾號。

 

責任編輯:武曉燕 來源: 鍋外的大佬
相關推薦

2020-03-27 11:41:12

線程 Java中止

2018-04-12 17:00:07

云計算燒烤SaaS

2021-02-03 09:04:11

解密Spring配置

2023-01-10 19:47:47

Redis原理多線程

2017-02-20 13:54:04

戴爾

2015-06-12 10:01:25

程序員代碼

2017-07-14 14:12:10

AndroidRecyclerVie

2020-11-04 07:56:19

工具Linux 翻譯

2021-06-07 12:08:06

iOS Python API

2021-12-12 18:18:15

代碼元宇宙Python

2020-08-03 08:10:52

UDPTCP通信

2022-10-10 08:00:00

微服務Spring Boo容器

2021-11-02 22:35:46

配置DubboLoadbalance

2024-02-19 00:00:00

Redis分布式

2021-05-14 13:30:17

Mybatis分表插件

2020-09-10 06:58:34

C語言DBProxy

2021-11-02 14:19:15

插件MavengroupId

2021-10-27 06:49:34

線程池Core函數

2021-10-04 09:29:41

對象池線程池

2022-03-01 11:38:51

RPC框架后端
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 毛片区 | 成人免费淫片aa视频免费 | 久久精品亚洲 | 久久最新精品视频 | 久久中文字幕电影 | 色视频在线观看 | 自拍第1页 | 日韩精品 | 91精品在线播放 | 日韩欧美中文字幕在线观看 | 国产精品日日夜夜 | 99re热精品视频 | 中文字幕不卡在线88 | 在线国产一区二区 | 久久久女女女女999久久 | 欧美国产精品一区二区三区 | 久久久久精 | 麻豆天堂 | 日韩一区二区免费视频 | 香蕉久久a毛片 | 国产精品一区在线 | 九一视频在线观看 | 日韩欧美一区二区三区在线播放 | 久久久女女女女999久久 | 国产精品久久久久久久久久免费看 | 日本成人福利 | 国产一区久久久 | www久久久 | 人人干在线视频 | 国精产品一品二品国精在线观看 | 在线一区视频 | 色屁屁在线观看 | 四虎成人免费电影 | 国产真实乱对白精彩久久小说 | 人人干在线视频 | 91精品国产一区二区三区 | 日本黄色短片 | 精品福利一区二区三区 | 日韩久久网 | 超黄视频网站 | 欧美888|