SpringBoot程序打包Docker鏡像的最佳方式
緣起
云計算時代的來臨,有一門被我譽為云計算伴生的編程語言: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)文章!
- SpringBoot項目docker分層鏡像構(gòu)建案例
- SpringBoot Docker鏡像分層的優(yōu)化指南
- SpringBoot制作Docker鏡像接入SkyWalking的詳細過程
- Docker自定義鏡像的實現(xiàn)步驟(SpringBoot程序為例)
- Docker打包SpringBoot鏡像的實現(xiàn)方式
- SpringBoot打包成Docker鏡像的項目實踐
- SpringBoot打包成Docker鏡像的幾種實現(xiàn)方式
- 一步步教你把SpringBoot項目打包成Docker鏡像
- SpringBoot打包docker鏡像發(fā)布的詳細步驟
- SpringBoot構(gòu)建Docker鏡像的實現(xiàn)步驟
相關(guā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 dev
在 Docker 使用過程中,“no space left on device” 錯誤是常見的磁盤空間不足問題,本文將結(jié)合實戰(zhàn)操作,詳細介紹該問題的排查與解決步驟,幫助開發(fā)者快速定位并修復問題,需要的朋友可以參考下2026-03-03
使用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集群問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
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)步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-03-03
基于Kubernetes和Docke實現(xiàn)留言簿案例
這篇文章主要介紹了基于Kubernetes和Docke實現(xiàn)留言簿案例,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-10-10

