詳解如何用SpringBoot 2.3.0.M1創(chuàng)建Docker映像
1、發(fā)布
SpringBoot2.3.0.M1剛剛發(fā)布,它帶來了一些有趣的新特性,可以幫助您將SpringBoot應用程序打包到Docker映像中。在這篇博客文章中,我們將查看創(chuàng)建Docker映像的典型方式,并展示如何通過使用這些新特性來改進這些鏡像
2、說明
SpringBoot 2.3.0.M1 暫時不支持Windows, 很雞肋
暫時在Mac 和Linux 上運行良好
3、常見的Docker 運行方式
一般情況下,通過docker 運行springboot 是這樣的
FROM openjdk:8-jdk-alpine
EXPOSE 8080
ARG JAR_FILE=target/my-application.jar
ADD ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
4、常規(guī)方式通過docker 運行springboot 存在的問題
不是說常規(guī)方式不行,是他有一些可以改進的地方
1、在運行jar 的時候,沒把jar 給解壓縮,而是直接運行了,這會導致一些額外的開銷,所以呢,最好能以沒壓縮的形式去運行
2、因為需要老是改代碼,然后重新運行,上面那個代碼就不那么的好用。因為你一般不會去修改依賴或者進行依賴升級這些操作,就是改改代碼,適應業(yè)務變化,所以呢,最好能分個層,這樣構(gòu)建速度就快起來了
5、如何解決常規(guī)方式的不足呢
spring 提供了兩項技術(shù)
1、buildpack
2、分層jar
如果您曾經(jīng)使用過像CloudFoundry或Heroku這樣的應用程序平臺,那么你可能使用了一個buildpack,可能甚至沒有意識到它是BuildPack平臺的一部分,它將應用程序轉(zhuǎn)換為平臺實際可以運行的東西。例如,CloudFoundry的Javabuildpack會注意到您正在搞一個.jar文件并自動添加相關的JRE
最近呢,spring 擺脫了云本地構(gòu)建包的一些束縛,讓不能獨立使用的這個東西呢,現(xiàn)在可以隨時隨地的構(gòu)建與docker 兼容的docker 鏡像了。
6、到底怎么構(gòu)建
Maven 方式
1、先下載一個包,然后解壓出來
$ curl https://start.spring.io/starter.zip -d bootVersion=2.3.0.M1 -d dependencies=web -o demo.zip $ unzip demo.zip
2、然后呢構(gòu)建鏡像就行,但是要確保本地已經(jīng)安裝了docker 才行
./mvnw spring-boot:build-image
3、你會看到這么一些日志
[INFO] Building image 'docker.io/library/demo:0.0.1-SNAPSHOT' [INFO] [INFO] > Pulling builder image 'docker.io/cloudfoundry/cnb:0.0.43-bionic' 100% [INFO] > Pulled builder image 'cloudfoundry/cnb@sha256:c983fb9602a7fb95b07d35ef432c04ad61ae8458263e7fb4ce62ca10de367c3b' [INFO] > Pulling run image 'docker.io/cloudfoundry/run:base-cnb' 100% [INFO] > Pulled run image 'cloudfoundry/run@sha256:ba9998ae4bb32ab43a7966c537aa1be153092ab0c7536eeef63bcd6336cbd0db' [INFO] > Executing lifecycle version v0.5.0 [INFO] > Using build cache volume 'pack-cache-5cbe5692dbc4.build' [INFO] [INFO] > Running detector [INFO] [detector] 6 of 13 buildpacks participating ... [INFO] [INFO] > Running restorer [INFO] [restorer] Restoring cached layer 'org.cloudfoundry.openjdk:2f08c469c9a8adea1b6ee3444ba2a8242a7e99d87976a077faf037a9eb7f884b' ... [INFO] [INFO] > Running cacher [INFO] [cacher] Reusing layer 'org.cloudfoundry.openjdk:2f08c469c9a8adea1b6ee3444ba2a8242a7e99d87976a077faf037a9eb7f884b' [INFO] [cacher] Reusing layer 'org.cloudfoundry.jvmapplication:executable-jar' [INFO] [cacher] Caching layer 'org.cloudfoundry.springboot:spring-boot' [INFO] [cacher] Reusing layer 'org.cloudfoundry.springautoreconfiguration:46ab131165317d91fd4ad3186abf755222744e2d277dc413def06f3ad45ab150' [INFO] [INFO] Successfully built image 'docker.io/library/demo:0.0.1-SNAPSHOT'
4、用docker 運行這個鏡像
docker run -it -p8080:8080 demo:0.0.1-SNAPSHOT
7、分層
SpringBoot提供的內(nèi)置支持為開始使用內(nèi)置包提供了一種很好的方式。因為它是buildpack平臺規(guī)范的實現(xiàn),所以很容易遷移到更強大的buildpack工具
最基本的springboot 的jar 文件內(nèi)部格式
META-INF/
MANIFEST.MF
org/
springframework/
boot/
loader/
...
BOOT-INF/
classes/
...
lib/
...
分成了三層,一個是引導加載文件,一個是class 運行文件,一個是依賴關系
但是分層結(jié)構(gòu)的jar 呢,會是這樣的結(jié)構(gòu)
META-INF/
MANIFEST.MF
org/
springframework/
boot/
loader/
...
BOOT-INF/
layers/
<name>/
classes/
...
lib/
...
<name>/
classes/
...
lib/
...
layers.idx
他不再把lib 放到分開的獨立的層里面,而是放到一起去了,然后分了幾層。
并且多了一個 idx 文件,這個文件里面是添加層的順序
最開始呢,分了這么些層,一共四個
1、dependencies(用于定期發(fā)布的依賴項)
2、snapshot-dependencies(用于快照依賴項)
3、resources(用于靜態(tài)資源)
4、application(適用于應用程序類和資源)
這種分層是依據(jù)呢,是根據(jù)代碼可能的更改來分離代碼,一般呢,依賴項不太可能更改,因此他放在了獨立的層里面
8、寫分層形式的dockerfile
首先呢,需要在項目的POM 文件中增加一個支持
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <layout>LAYERED_JAR</layout> </configuration> </plugin> </plugins> </build>
jarmode是一個特殊的系統(tǒng)屬性,您可以在啟動JAR時設置它。它允許引導代碼運行與應用程序完全不同的東西。例如,提取層的東西
這樣就可以運行l(wèi)ayertools 模式
java -Djarmode=layertools -jar my-app.jar
項目搞好了呢,就重新編譯打包
mvn clean package
打包好了呢,我們就測試一下
java -Djarmode=layertools -jar target/demo-0.0.1-SNAPSHOT.jar list
可以看到他輸出了幾個層
dependencies snapshot-dependencies resources application
我們現(xiàn)在寫一個dockerfile 來提取并復制這幾個層來構(gòu)建鏡像
FROM adoptopenjdk:11-jre-hotspot as builder
WORKDIR application
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} application.jar
RUN java -Djarmode=layertools -jar application.jar extract
FROM adoptopenjdk:11-jre-hotspot
WORKDIR application
COPY --from=builder application/dependencies/ ./
COPY --from=builder application/snapshot-dependencies/ ./
COPY --from=builder application/resources/ ./
COPY --from=builder application/application/ ./
ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]
這是一個多階段的docker 文件,他builder 提取了需要的文件,就是前面我們拆掉的四個層。全給他弄進去
然后我們開始構(gòu)建
docker build . --tag demo
構(gòu)建完了,我們就跑他一下
docker run -it -p8080:8080 demo:latest
到此這篇關于詳解如何用SpringBoot 2.3.0.M1創(chuàng)建Docker映像的文章就介紹到這了,更多相關SpringBoot 2.3.0.M1創(chuàng)建Docker映像內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
解決springboot 多線程使用MultipartFile讀取excel文件內(nèi)容報錯問題
這篇文章主要介紹了解決springboot 多線程使用MultipartFile讀取excel文件內(nèi)容報錯問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
Spring?Boot?啟動參數(shù)之如何優(yōu)雅地控制你的應用(最新推薦)
Spring Boot 提供了哪些方式來配置這些啟動參數(shù),今天我們就來詳細解析 Spring Boot 啟動參數(shù)的各種用法,并附帶代碼示例,讓你可以靈活掌控應用的啟動過程,需要的朋友可以參考下2025-04-04
Java中jdk1.8和jdk17相互切換實戰(zhàn)步驟
之前做Java項目時一直用的是jdk1.8,現(xiàn)在想下載另一個jdk版本17,并且在之后的使用中可以進行相互切換,下面這篇文章主要給大家介紹了關于Java中jdk1.8和jdk17相互切換的相關資料,需要的朋友可以參考下2023-05-05

