最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot Docker鏡像分層的優(yōu)化指南

 更新時間:2025年10月23日 10:11:04   作者:lang20150928  
關(guān)于如何優(yōu)化SpringBoot應用程序的Docker鏡像構(gòu)建 的,核心思想是:不要簡單地把一個胖JAR包直接扔進Docker鏡像里運行,而應該利用分層技術(shù)來提升鏡像的構(gòu)建效率和部署性能,所以本文給大家介紹了SpringBoot Docker鏡像分層的優(yōu)化指南,需要的朋友可以參考下

導讀

關(guān)于 如何優(yōu)化 Spring Boot 應用程序的 Docker 鏡像構(gòu)建 的,核心思想是:不要簡單地把一個“胖 JAR 包”(fat jar)直接扔進 Docker 鏡像里運行,而應該利用分層(layering)技術(shù)來提升鏡像的構(gòu)建效率和部署性能。

下面我用通俗易懂的方式為你逐段解析,并總結(jié)關(guān)鍵點。

1. 為什么不能直接復制 fat jar 到 Docker 鏡像?

原文說:

There’s always a certain amount of overhead when running a fat jar without unpacking it, and in a containerized environment this can be noticeable.

意思是:

  • 雖然你可以寫幾行 Dockerfile 把 Spring Boot 的 .jar 文件拷貝進去然后 java -jar app.jar 運行。
  • 但這樣做的問題是:
    • 性能開銷:JVM 每次都要從壓縮的 JAR 包中讀取類文件,不如解壓后直接訪問快(尤其在容器頻繁啟動時更明顯)。
    • 鏡像體積大、更新慢:整個應用被打包成一個“胖 JAR”,每次你改了一行代碼重新打包,整個 JAR 都變了 → 導致 Docker 鏡像的所有層都失效 → 下次構(gòu)建必須重新上傳全部內(nèi)容,效率極低。

2. 解決方案:使用 分層(Layering) 技術(shù)

核心理念:

把你的 JAR 包拆分成幾個“層”(layers),比如:

層名內(nèi)容是否經(jīng)常變化
dependencies第三方依賴庫(如 Spring、MyBatis 等)? 很少變
spring-boot-loaderSpring Boot 自帶的啟動器代碼? 幾乎不變
snapshot-dependencies快照版本的依賴(開發(fā)中的內(nèi)部模塊)?? 偶爾變
application你自己寫的業(yè)務代碼和配置文件? 經(jīng)常變

目標:讓不常變的部分放在上層,常變的部分放在下層。這樣每次只重建最底層(application),其他層可以復用緩存!

3. 如何實現(xiàn)分層?—— 添加 layers.idx

Spring Boot 支持在打包時生成一個叫 layers.idx 的索引文件,它記錄了哪些文件屬于哪一層。

例如:

- "dependencies":
  - BOOT-INF/lib/library1.jar
  - BOOT-INF/lib/library2.jar
- "spring-boot-loader":
  - org/springframework/boot/loader/JarLauncher.class
- "application":
  - BOOT-INF/classes/com/example/MyController.class

這個文件會在你構(gòu)建項目時自動生成(需要配置 Maven 或 Gradle 插件)。

4. 使用 jarmode=layertools 提取分層內(nèi)容

Spring Boot 提供了一個特殊模式:layertools,可以用它來提取這些層。

命令:

java -Djarmode=layertools -jar my-app.jar extract

執(zhí)行后會自動把 JAR 解開成多個目錄:

/
├── dependencies/         ← 第三方依賴
├── spring-boot-loader/   ← 啟動類
├── snapshot-dependencies/← 快照依賴
└── application/          ← 你的代碼

5. 編寫優(yōu)化版 Dockerfile(多階段構(gòu)建)

利用上面提取出的目錄結(jié)構(gòu),我們可以寫一個高效的 Dockerfile

# 第一階段:構(gòu)建并提取分層
FROM eclipse-temurin:11-jre AS builder
WORKDIR /app
COPY target/myapp.jar app.jar
RUN java -Djarmode=layertools -jar app.jar extract

# 第二階段:組裝最終鏡像
FROM eclipse-temurin:11-jre
WORKDIR /app
# 分別拷貝每一層(順序很重要!不變的放前面)
COPY --from=builder /app/dependencies/ ./
COPY --from=builder /app/spring-boot-loader/ ./
COPY --from=builder /app/snapshot-dependencies/ ./
COPY --from=builder /app/application/ ./

# 啟動時通過 JarLauncher 加載
ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]

 好處是什么?

  • 當你下次修改了代碼再構(gòu)建鏡像時:
    • dependencies 層沒變 → Docker 直接使用緩存 ?
    • 只有 application 層變了 → 只重新構(gòu)建這一層 ?
  • 構(gòu)建速度快、推送體積小、節(jié)省網(wǎng)絡帶寬!

6. 替代方案:使用 Buildpacks(云原生構(gòu)建包)

除了手寫 Dockerfile,Spring Boot 還支持一種更簡單的自動化方式:Buildpacks。

Buildpack 是一種“智能打包工具”,能自動識別你的應用類型(Java/Spring Boot),并幫你生成標準的 OCI 鏡像(就是 Docker 能跑的鏡像)。

優(yōu)點:

  • 不用手寫 Dockerfile
  • 自動生成安全、高效、符合規(guī)范的鏡像
  • 支持 layers.idx,也能做到分層優(yōu)化

Maven 用戶可以直接運行:

./mvnw spring-boot:build-image

Gradle 用戶:

./gradlew bootBuildImage

就會自動生成一個名為 myapp:latest 的本地鏡像。

總結(jié):你應該怎么理解這段話?

關(guān)鍵點說明
不推薦做法直接 COPY app.jar . 然后 java -jar app.jar
推薦做法使用 分層 + 多階段 Dockerfile 或 Buildpacks
核心優(yōu)勢利用 Docker 的緩存機制,提高 CI/CD 效率
實現(xiàn)方式打包時生成 layers.idx → 用 jarmode=layertools 提取 → 分層 COPY
更簡單的方法用 spring-boot:build-image 自動生成優(yōu)化鏡像

給開發(fā)者的建議:

  • 在 pom.xml 或 build.gradle 中啟用 layered jar 支持。
  • 如果你想完全控制鏡像,就寫一個帶 layertools 的 Dockerfile。
  • 如果你想快速上線、減少運維負擔,直接用 bootBuildImage 命令即可。

簡單來說:“把不變的東西放上面,變的東西放下面,讓 Docker 緩存幫我們加速。”

這就是這段文檔的核心思想。

以上就是SpringBoot Docker鏡像分層的優(yōu)化指南的詳細內(nèi)容,更多關(guān)于SpringBoot Docker鏡像分層的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Spring Boot 實現(xiàn)配置文件加解密原理

    Spring Boot 實現(xiàn)配置文件加解密原理

    這篇文章主要介紹了Spring Boot 實現(xiàn)配置文件加解密原理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • Java 實現(xiàn)簡易教務管理系統(tǒng)的代碼

    Java 實現(xiàn)簡易教務管理系統(tǒng)的代碼

    這篇文章主要介紹了Java 實現(xiàn)簡易教務管理系統(tǒng)的代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • 利用SpringMVC接收復雜對象和多個文件(前端使用JQuery)

    利用SpringMVC接收復雜對象和多個文件(前端使用JQuery)

    這篇文章主要介紹了利用SpringMVC接收復雜對象和多個文件(前端使用JQuery),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 源碼分析Spring?中?@Qualifier?注解基本用法

    源碼分析Spring?中?@Qualifier?注解基本用法

    這篇文章主要介紹了源碼分析Spring?中?@Qualifier?注解基本用法,在源碼分析的過程中,也?GET?到?Spring?許多新的玩法,感興趣的小伙伴趕緊去試試吧
    2023-08-08
  • Java集合之HashMap用法詳解

    Java集合之HashMap用法詳解

    這篇文章主要介紹了Java集合之HashMap用法,結(jié)合實例形式分析了java map集合中HashMap定義、遍歷等相關(guān)操作技巧,需要的朋友可以參考下
    2017-05-05
  • 解決idea中Terminal終端無法執(zhí)行GIT命令+Terminal 中文亂碼問題

    解決idea中Terminal終端無法執(zhí)行GIT命令+Terminal 中文亂碼問題

    這篇文章主要介紹了解決idea中Terminal終端無法執(zhí)行GIT命令+Terminal 中文亂碼問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • Java?spring?boot發(fā)送郵箱實現(xiàn)過程記錄

    Java?spring?boot發(fā)送郵箱實現(xiàn)過程記錄

    我們在?站上注冊賬號的時候?般需要獲取驗證碼,?這個驗證碼?般發(fā)送在你的?機號上還有的是發(fā)送在你的郵箱中,這篇文章主要給大家介紹了關(guān)于Java?spring?boot發(fā)送郵箱實現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • Mybatis-plus在項目中的簡單應用

    Mybatis-plus在項目中的簡單應用

    Mybatis-plus是Spring框架中OOM的一大利器,其簡單易用參考官網(wǎng)文檔即可很快上手,本文主要介紹了邏輯刪除,自動填充,分頁插件等的簡單使用,感興趣的可以了解一下
    2021-07-07
  • servlet實現(xiàn)用戶登錄小程序

    servlet實現(xiàn)用戶登錄小程序

    這篇文章主要為大家詳細介紹了servlet實現(xiàn)用戶登錄的小程序,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Java調(diào)用MySQL存儲過程并獲得返回值的方法

    Java調(diào)用MySQL存儲過程并獲得返回值的方法

    這篇文章主要介紹了Java調(diào)用MySQL存儲過程并獲得返回值的方法,實例分析了java實現(xiàn)MySQL存儲過程的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07

最新評論

恩施市| 定日县| 广平县| 马关县| 磐安县| 紫阳县| 侯马市| 鄱阳县| 仙游县| 巫溪县| 余庆县| 县级市| 太仆寺旗| 宜丰县| 汝城县| 阜新| 乌兰察布市| 新兴县| 西平县| 大安市| 洛浦县| 申扎县| 峨边| 兴安县| 乌审旗| 房山区| 衡南县| 汽车| 利川市| 尼玛县| 扎鲁特旗| 宜州市| 曲阳县| 平原县| 赤水市| 新民市| 遵义市| 台湾省| 武宁县| 平顶山市| 那曲县|