欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot創(chuàng)建Docker鏡像的方法步驟

 更新時(shí)間:2020年11月17日 11:09:16   作者:鍋外的大佬  
這篇文章主要介紹了SpringBoot創(chuàng)建Docker鏡像的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

隨著越來越多的組織轉(zhuǎn)向容器和虛擬服務(wù)器,Docker正成為軟件開發(fā)工作流程中一個(gè)更重要的部分。為此,Spring Boot 2.3中最新的功能之中,提供了為Spring Boot應(yīng)用程序創(chuàng)建 Docker 鏡像的能力。

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

1. 傳統(tǒng)Docker構(gòu)建

使用Spring Boot 構(gòu)建 Docker 鏡像的傳統(tǒng)方法是使用 Dockerfile 。下面是一個(gè)簡(jiǎn)單的例子:

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

然后我們可以使用 docker build 命令來創(chuàng)建 Docker 映像。這對(duì)大多數(shù)應(yīng)用程序都很好,但也有一些缺點(diǎn)。

首先,我們使用的是 Spring Boot 創(chuàng)建的 fat jar。這會(huì)影響啟動(dòng)時(shí)間,尤其是在集裝箱環(huán)境中。我們可以通過添加jar文件的分解內(nèi)容來節(jié)省啟動(dòng)時(shí)間。

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

通過在構(gòu)建之前分解 jar ,應(yīng)用程序代碼和第三方庫(kù)各自獲得自己的層。這樣,我們便可以利用Docker的緩存機(jī)制?,F(xiàn)在,當(dāng)某一行代碼被更改時(shí),只需要重新構(gòu)建相應(yīng)的層。

考慮到這一點(diǎn),讓我們看看Spring Boot 如何改進(jìn)創(chuàng)建Docker鏡像的過程。

2. Buildpacks

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

例如,給定一個(gè)Spring Boot fat jar,一個(gè)buildpack將為我們提供Java運(yùn)行時(shí)。這使我們可以跳過 Dockerfile 并自動(dòng)獲得一個(gè)合理的docker 鏡像。

Spring Boot 包括對(duì) bulidpacks 的Maven和Gradle支持。例如,使用Maven構(gòu)建時(shí),我們將運(yùn)行以下命令:

./mvnw spring-boot:build-image

我們觀察下一些相關(guān)的輸出,看看發(fā)生了什么:

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

第一行顯示我們構(gòu)建了標(biāo)準(zhǔn)的 fat jar,與其他典型的maven包一樣。

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

packeto 是基于云原生 bulidpacks 的實(shí)現(xiàn)。它負(fù)責(zé)分析我們的項(xiàng)目并確定所需的框架和庫(kù)。在我們的例子中,它確定我們有一個(gè)Spring Boot項(xiàng)目并添加所需的構(gòu)建包。

最后,我們看到生成的Docker映像和總構(gòu)建時(shí)間。注意,在第一次構(gòu)建時(shí),花了相當(dāng)多的時(shí)間下載構(gòu)建包并創(chuàng)建不同的層。

buildpacks 的一大特點(diǎn)是Docker映像是多層的。因此,如果我們只更改應(yīng)用程序代碼,后續(xù)構(gòu)建將更快:

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

3. 層級(jí)jar包

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

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

org/
 springframework/
  boot/
 loader/
...
BOOT-INF/
 classes/
...
lib/
...

fat jar 由3個(gè)主要區(qū)域組成:

  • 啟動(dòng)Spring應(yīng)用程序所需的引導(dǎo)類
  • 應(yīng)用程序代碼
  • 第三方庫(kù)

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

- "dependencies":
 - "BOOT-INF/lib/"
- "spring-boot-loader":
 - "org/"
- "snapshot-dependencies":
- "application":
 - "BOOT-INF/classes/"
 - "BOOT-INF/classpath.idx"
 - "BOOT-INF/layers.idx"
 - "META-INF/"

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

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

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

我們的目標(biāo)是將應(yīng)用程序代碼和第三方庫(kù)放置到層中,以反映它們更改的頻率。

例如,應(yīng)用程序代碼可能是更改最頻繁的代碼,因此它有自己的層。此外,每一層都可以獨(dú)立演化,只有當(dāng)一層發(fā)生變化時(shí),才會(huì)為它重建 Docker 鏡像。

現(xiàn)在我們了解了分層 jar 結(jié)構(gòu),接下來看看如何利用它來制作 Docker 映像。

3.1.創(chuàng)建分層 jar

首先,我們必須建立一個(gè)項(xiàng)目來創(chuàng)建一個(gè)分層的jar。對(duì)于Maven,則需要在POM的 Spring Boot plugin 部分添加一個(gè)新的配置:

<plugin>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-maven-plugin</artifactId>
  <configuration>
    <layers>
      <enabled>true</enabled>
    </layers>
  </configuration>
</plugin>

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

3.2. 查看和提取分層

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

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

然后提取它們,運(yùn)行命令:

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

3.3. 創(chuàng)建Docker映像

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

FROM adoptopenjdk:11-jre-hotspot as builder
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} application.jar
RUN java -Djarmode=layertools -jar application.jar extract
 
FROM adoptopenjdk:11-jre-hotspot
COPY --from=builder dependencies/ ./
COPY --from=builder snapshot-dependencies/ ./
COPY --from=builder spring-boot-loader/ ./
COPY --from=builder application/ ./
ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]

這個(gè) Dockerfile 從fat jar中提取層,然后將每個(gè)層復(fù)制到Docker映像中。

每個(gè)COPY指令最終都會(huì)在Docker映像中生成一個(gè)新層。

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

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

4.總結(jié)

在本文中,我們學(xué)習(xí)了使用 Spring Boot 構(gòu)建 Docker 映像的各種方法。

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

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

到此這篇關(guān)于SpringBoot創(chuàng)建Docker鏡像的方法步驟的文章就介紹到這了,更多相關(guān)SpringBoot創(chuàng)建Docker鏡像內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Idea2023配置tomcat服務(wù)器的圖文教程

    Idea2023配置tomcat服務(wù)器的圖文教程

    這篇文章主要介紹了Idea2023配置tomcat服務(wù)器的圖文教程,本文是javaweb新手版教程,IDEA2023+JDK1.8+apache-tomcat-8.5.91,沒有使用Maven,需要的朋友可以參考下
    2023-10-10
  • JAVA學(xué)習(xí)進(jìn)階篇之時(shí)間與日期相關(guān)類

    JAVA學(xué)習(xí)進(jìn)階篇之時(shí)間與日期相關(guān)類

    在日常的開發(fā)工作當(dāng)中,我們經(jīng)常需要用到日期相關(guān)的類,下面這篇文章主要給大家介紹了關(guān)于JAVA學(xué)習(xí)進(jìn)階篇之時(shí)間與日期相關(guān)類的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • 詳解SpringBoot如何統(tǒng)一后端返回格式

    詳解SpringBoot如何統(tǒng)一后端返回格式

    今天我們來聊一聊在基于SpringBoot前后端分離開發(fā)模式下,如何友好的返回統(tǒng)一的標(biāo)準(zhǔn)格式以及如何優(yōu)雅的處理全局異常,感興趣的可以了解一下
    2021-07-07
  • 一文帶你搞懂Java中線程的創(chuàng)建方式

    一文帶你搞懂Java中線程的創(chuàng)建方式

    這篇文章主要為大家詳細(xì)介紹了Java中線程的創(chuàng)建方式的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解一下
    2023-03-03
  • Spring注解中@Configuration和@Component到底有啥區(qū)別

    Spring注解中@Configuration和@Component到底有啥區(qū)別

    之前一直搞不清@Component和@Configuration這兩個(gè)注解到底有啥區(qū)別,一直認(rèn)為被這兩修飾的類可以被Spring實(shí)例化嘛,最近終于弄明白了,這篇文章主要給大家介紹了關(guān)于Spring注解中@Configuration和@Component到底有啥區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • java代碼實(shí)現(xiàn)雙向鏈表

    java代碼實(shí)現(xiàn)雙向鏈表

    這篇文章主要為大家詳細(xì)介紹了java代碼實(shí)現(xiàn)雙向鏈表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • SpringBoot實(shí)現(xiàn)固定和動(dòng)態(tài)定時(shí)任務(wù)的三種方法

    SpringBoot實(shí)現(xiàn)固定和動(dòng)態(tài)定時(shí)任務(wù)的三種方法

    定時(shí)器是我們項(xiàng)目中經(jīng)常會(huì)用到的,本文主要介紹了SpringBoot實(shí)現(xiàn)固定和動(dòng)態(tài)定時(shí)任務(wù)的三種方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • Java語言實(shí)現(xiàn)二叉堆的打印代碼分享

    Java語言實(shí)現(xiàn)二叉堆的打印代碼分享

    這篇文章主要介紹了Java語言實(shí)現(xiàn)二叉堆的打印代碼分享,具有一定借鑒價(jià)值,需要的朋友可以了解下。
    2017-12-12
  • java實(shí)現(xiàn)二叉樹的創(chuàng)建及5種遍歷方法(總結(jié))

    java實(shí)現(xiàn)二叉樹的創(chuàng)建及5種遍歷方法(總結(jié))

    下面小編就為大家?guī)硪黄猨ava實(shí)現(xiàn)二叉樹的創(chuàng)建及5種遍歷方法(總結(jié))。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-04-04
  • Java原生序列化和反序列化代碼實(shí)例

    Java原生序列化和反序列化代碼實(shí)例

    這篇文章主要介紹了Java原生序列化和反序列化代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02

最新評(píng)論