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

SpringBoot程序打包Docker鏡像的最佳方式

 更新時間:2026年03月24日 08:51:37   作者:說實話起個名字真難啊  
本文探索了SpringBoot程序打包Docker鏡像的幾種方式及其性能表現(xiàn),作者通過四種方法進行測試,并通過代碼示例講解的非常詳細,具有一定的參考價值,需要的朋友可以參考下

緣起

云計算時代的來臨,有一門被我譽為云計算伴生的編程語言:golang

其與docker的天生的搭配,開啟了云計算的黃金時代。

然而java確實一門不服老的語言,不斷的進化著,springboot 4 和spring 7的發(fā)布,尤其是springboot4 ,GraalVM 25 直接從實驗特性轉(zhuǎn)向了生產(chǎn)。虛擬線程常態(tài)化也是值得學習的特性。

加上還有很多的老的項目還在用springboot技術(shù),所以想把java的整個技術(shù)棧再撿起來學習一遍:后續(xù)會陸續(xù)寫一些關(guān)于springboot4 、jkd 25 lts的一些文。

學到哪兒就寫到哪兒:今天想試試springboot程序打包docker的幾種方式的大小區(qū)別,探索一下最佳的方式!

開始

準備一個最簡單的restful的程序,使用spring initializr 生成項目,基礎(chǔ)配置如下:

注意2點:1、java 25 2、加入graalvm

一個hello world

package com.example.demo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
class HelloController {
    @GetMapping("/hello")
    String sayHello(){
        return "hello world!";
    }
}

顯示編譯一下代碼,看看原始jar包有多大:

./gradlew build

一個包含mvc基本程序的一個hello world,大小79M

方式一:全默認方式的打包鏡像

不做任何更多的配置,只使用springboot 4 和gradle的默認配置:

根據(jù)資料,springboot的默認使用paketobuildpacks/builder-jammy-tiny 鏡像,這是一個以ubuntu 22為基礎(chǔ)的鏡像,大小50-70M:

注意:猶豫我們生成項目配置的時候加入了graalm支持,必須先注釋調(diào),否則默認會使用graal技術(shù):

build.gradle 文件部分:

plugins {
	id 'java'
	id 'org.springframework.boot' version '4.0.3'
	id 'io.spring.dependency-management' version '1.1.7'
	//id 'org.graalvm.buildtools.native' version '0.11.4'
}

使用命令打包:

./gradlew bootBuildImage --imageName=hello:normal

大小337M,同時也可以看到打包下載的基礎(chǔ)鏡像:

方式二: 默認配置graalvm打包

加入graalvm的配置(方式一注釋調(diào)的部分),打包:

./gradlew bootBuildImage --imageName=hello:gralvm

大小123M:

方式三: 手工打包,使用標注openjdk鏡像為基礎(chǔ)

所謂手工打包,就是自己寫dockerfile,自己設(shè)置基礎(chǔ)鏡像,先試試默認情況下常用的openjdk鏡像

FROM openjdk:25-jdk-slim
WORKDIR /app
RUN useradd -U spring
USER spring:spring
COPY build/libs/*.jar app.jar
EXPOSE 8080
CMD ["java", "-jar", "app.jar"]

打包命令:

docker build -t hello:openjdk -f deploy/openjdk.Dockerfile .

大?。?05M

方式四: 手工打包,使用jlink構(gòu)建一個最小的運行jre環(huán)境,以alpine為基礎(chǔ)

雖然現(xiàn)在的java不再單獨提供jre環(huán)境了,但是可以通過jlink構(gòu)建一個程序所需的最小運行環(huán)境,然后部署到alpine linux上

FROM eclipse-temurin:25-jdk-alpine AS jre-builder

RUN apk update && apk add binutils

RUN $JAVA_HOME/bin/jlink \
         --verbose \
         --add-modules java.base \
         --strip-debug \
         --no-man-pages \
         --no-header-files \
         --compress=2 \
         --output /optimized-jdk-25

FROM alpine:latest
ENV JAVA_HOME=/opt/jdk/jdk-25
ENV PATH="${JAVA_HOME}/bin:${PATH}"

COPY --from=jre-builder /optimized-jdk-25 $JAVA_HOME

RUN addgroup --system spring && adduser --system spring --ingroup spring

RUN mkdir /app && chown -R $APPLICATION_USER /app
COPY --chown=spring:spring build/libs/*.jar /app/app.jar
WORKDIR /app
USER spring
EXPOSE 8080
ENTRYPOINT [ "java", "-jar", "/app/app.jar" ]

構(gòu)建命令:

docker build -t hello:alpine -f deploy/jlink.Dockerfile .

大?。?93M

有點不放心,跑一下試試:

docker run -it -p 8080:8080 hello:alpine

訪問一下:

一切正常!

小結(jié)

以上只是比較了打包大小的不同,這對graalvm是不公平的,畢竟他的特點是增強 AOT(Ahead-of-Time)編譯,降低內(nèi)存占用,提高啟動時間,還是得測試一下:

docker run -it -p 8080:8080 --name alpine hello:alpine
docker run -it -p 9090:8080 --name graalvm hello:graalvm
docker stats

看到資源占用:

graalvm的內(nèi)存占用不到原始java代碼的1/4!

所以:

1、對應(yīng)新的項目,高版本jdk項目,尤其是最小的25版本,完全可以考慮以graalvm來編譯打包

2、對應(yīng)舊的項目,或者低版本jdk的項目,生產(chǎn)環(huán)境使用alpine定制jre的方式,就是方式4,測試環(huán)境就使用默認openjdk:畢竟包含了大量的工具,方便調(diào)測。

以上就是SpringBoot程序打包Docker鏡像的最佳方式的詳細內(nèi)容,更多關(guān)于SpringBoot打包Docker鏡像的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Docker-compose進階配置之環(huán)境變量與配置隔離方式

    Docker-compose進階配置之環(huán)境變量與配置隔離方式

    本文系統(tǒng)講解了Docker-compose環(huán)境變量的使用方法,涵蓋配置隔離、多環(huán)境管理、變量優(yōu)先級及安全實踐,通過.env文件、變量替換和分層策略實現(xiàn)靈活、安全的配置方案,助力高效應(yīng)對開發(fā)到生產(chǎn)環(huán)境的配置挑戰(zhàn)
    2025-08-08
  • Docker加載鏡像時出現(xiàn) “no space left on device” 錯誤的解決方法

    Docker加載鏡像時出現(xiàn) “no space left on dev

    在 Docker 使用過程中,“no space left on device” 錯誤是常見的磁盤空間不足問題,本文將結(jié)合實戰(zhàn)操作,詳細介紹該問題的排查與解決步驟,幫助開發(fā)者快速定位并修復問題,需要的朋友可以參考下
    2026-03-03
  • docker啟動MySQL容器失敗原因分析以及排查記錄

    docker啟動MySQL容器失敗原因分析以及排查記錄

    在使用Docker啟動MySQL容器時,遇到了配置文件路徑錯誤的問題,通過查看容器日志發(fā)現(xiàn),容器讀取的配置文件路徑與指定的不一致,解決方法是修改啟動命令中的配置文件路徑,將其指向正確的目錄,最終,容器成功啟動并進入Up狀態(tài)
    2025-02-02
  • 使用docker compose搭建consul集群環(huán)境的例子

    使用docker compose搭建consul集群環(huán)境的例子

    consul是HashCorp公司推出使用go語言編寫的開源工具,用于實現(xiàn)分布式系統(tǒng)的服務(wù)發(fā)現(xiàn)與配置,今天給大家普及使用docker compose搭建consul集群環(huán)境的方法及consul基本知識講解,感興趣的朋友一起看看吧
    2021-06-06
  • Docker如何部署SQL?Server?2017?Always?On集群

    Docker如何部署SQL?Server?2017?Always?On集群

    這篇文章主要介紹了Docker如何部署SQL?Server?2017?Always?On集群問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Docker快速入門以及環(huán)境配置詳解

    Docker快速入門以及環(huán)境配置詳解

    Docker應(yīng)該算是很熱門的技術(shù)了,之前一直沒怎么真正地去了解、接觸。通過翻譯這篇簡單的教程,我同時也對Dcoker有了入門的了解。Docker確實是跨平臺開發(fā)的利器。有需要的朋友們下面跟著小編一起來看看吧。
    2016-10-10
  • docker compose和docker-compose的區(qū)別及使用說明

    docker compose和docker-compose的區(qū)別及使用說明

    Docker Compose V2 是 Docker Compose V1 的替代品,使用 Go 語言編譯,性能更好,資源占用更低,新特性包括 Watch 模式、等待服務(wù)就緒、環(huán)境隔離、更好的依賴控制、并行構(gòu)建和 DryRun 模式,V2 兼容 V1 的 compose 文件格式,遷移簡單
    2026-01-01
  • Docker部署Flask應(yīng)用的實現(xiàn)步驟

    Docker部署Flask應(yīng)用的實現(xiàn)步驟

    這篇文章主要介紹了Docker部署Flask應(yīng)用的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • Docker容器簡單部署nginx過程解析

    Docker容器簡單部署nginx過程解析

    這篇文章主要介紹了Docker容器簡單部署nginx過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • 基于Kubernetes和Docke實現(xiàn)留言簿案例

    基于Kubernetes和Docke實現(xiàn)留言簿案例

    這篇文章主要介紹了基于Kubernetes和Docke實現(xiàn)留言簿案例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10

最新評論

石棉县| 汤原县| 唐河县| 阳原县| 静乐县| 安图县| 扶绥县| 孝昌县| 晴隆县| 西宁市| 洛川县| 中超| 靖州| 昭苏县| 通江县| 淮南市| 德安县| 离岛区| 太白县| 色达县| 靖安县| 新建县| 淮安市| 西城区| 泾源县| 邹城市| 达日县| 施秉县| 正阳县| 开原市| 平谷区| 资兴市| 顺义区| 靖西县| 阿荣旗| 织金县| 依安县| 沧州市| 上饶县| 陕西省| 九龙县|