詳解如何用SpringBoot 2.3.0.M1創(chuàng)建Docker映像
1、發(fā)布
SpringBoot2.3.0.M1剛剛發(fā)布,它帶來(lái)了一些有趣的新特性,可以幫助您將SpringBoot應(yīng)用程序打包到Docker映像中。在這篇博客文章中,我們將查看創(chuàng)建Docker映像的典型方式,并展示如何通過(guò)使用這些新特性來(lái)改進(jìn)這些鏡像
2、說(shuō)明
SpringBoot 2.3.0.M1 暫時(shí)不支持Windows, 很雞肋
暫時(shí)在Mac 和Linux 上運(yùn)行良好
3、常見(jiàn)的Docker 運(yùn)行方式
一般情況下,通過(guò)docker 運(yùn)行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ī)方式通過(guò)docker 運(yùn)行springboot 存在的問(wèn)題
不是說(shuō)常規(guī)方式不行,是他有一些可以改進(jìn)的地方
1、在運(yùn)行jar 的時(shí)候,沒(méi)把jar 給解壓縮,而是直接運(yùn)行了,這會(huì)導(dǎo)致一些額外的開(kāi)銷(xiāo),所以呢,最好能以沒(méi)壓縮的形式去運(yùn)行
2、因?yàn)樾枰鲜歉拇a,然后重新運(yùn)行,上面那個(gè)代碼就不那么的好用。因?yàn)槟阋话悴粫?huì)去修改依賴(lài)或者進(jìn)行依賴(lài)升級(jí)這些操作,就是改改代碼,適應(yīng)業(yè)務(wù)變化,所以呢,最好能分個(gè)層,這樣構(gòu)建速度就快起來(lái)了
5、如何解決常規(guī)方式的不足呢
spring 提供了兩項(xiàng)技術(shù)
1、buildpack
2、分層jar
如果您曾經(jīng)使用過(guò)像CloudFoundry或Heroku這樣的應(yīng)用程序平臺(tái),那么你可能使用了一個(gè)buildpack,可能甚至沒(méi)有意識(shí)到它是BuildPack平臺(tái)的一部分,它將應(yīng)用程序轉(zhuǎn)換為平臺(tái)實(shí)際可以運(yùn)行的東西。例如,CloudFoundry的Javabuildpack會(huì)注意到您正在搞一個(gè).jar文件并自動(dòng)添加相關(guān)的JRE
最近呢,spring 擺脫了云本地構(gòu)建包的一些束縛,讓不能獨(dú)立使用的這個(gè)東西呢,現(xiàn)在可以隨時(shí)隨地的構(gòu)建與docker 兼容的docker 鏡像了。
6、到底怎么構(gòu)建
Maven 方式
1、先下載一個(gè)包,然后解壓出來(lái)
$ 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、你會(huì)看到這么一些日志
[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 運(yùn)行這個(gè)鏡像
docker run -it -p8080:8080 demo:0.0.1-SNAPSHOT
7、分層
SpringBoot提供的內(nèi)置支持為開(kāi)始使用內(nèi)置包提供了一種很好的方式。因?yàn)樗莃uildpack平臺(tái)規(guī)范的實(shí)現(xiàn),所以很容易遷移到更強(qiáng)大的buildpack工具
最基本的springboot 的jar 文件內(nèi)部格式
META-INF/ MANIFEST.MF org/ springframework/ boot/ loader/ ... BOOT-INF/ classes/ ... lib/ ...
分成了三層,一個(gè)是引導(dǎo)加載文件,一個(gè)是class 運(yùn)行文件,一個(gè)是依賴(lài)關(guān)系
但是分層結(jié)構(gòu)的jar 呢,會(huì)是這樣的結(jié)構(gòu)
META-INF/ MANIFEST.MF org/ springframework/ boot/ loader/ ... BOOT-INF/ layers/ <name>/ classes/ ... lib/ ... <name>/ classes/ ... lib/ ... layers.idx
他不再把lib 放到分開(kāi)的獨(dú)立的層里面,而是放到一起去了,然后分了幾層。
并且多了一個(gè) idx 文件,這個(gè)文件里面是添加層的順序
最開(kāi)始呢,分了這么些層,一共四個(gè)
1、dependencies(用于定期發(fā)布的依賴(lài)項(xiàng))
2、snapshot-dependencies(用于快照依賴(lài)項(xiàng))
3、resources(用于靜態(tài)資源)
4、application(適用于應(yīng)用程序類(lèi)和資源)
這種分層是依據(jù)呢,是根據(jù)代碼可能的更改來(lái)分離代碼,一般呢,依賴(lài)項(xiàng)不太可能更改,因此他放在了獨(dú)立的層里面
8、寫(xiě)分層形式的dockerfile
首先呢,需要在項(xiàng)目的POM 文件中增加一個(gè)支持
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <layout>LAYERED_JAR</layout> </configuration> </plugin> </plugins> </build>
jarmode是一個(gè)特殊的系統(tǒng)屬性,您可以在啟動(dòng)JAR時(shí)設(shè)置它。它允許引導(dǎo)代碼運(yùn)行與應(yīng)用程序完全不同的東西。例如,提取層的東西
這樣就可以運(yùn)行l(wèi)ayertools 模式
java -Djarmode=layertools -jar my-app.jar
項(xiàng)目搞好了呢,就重新編譯打包
mvn clean package
打包好了呢,我們就測(cè)試一下
java -Djarmode=layertools -jar target/demo-0.0.1-SNAPSHOT.jar list
可以看到他輸出了幾個(gè)層
dependencies snapshot-dependencies resources application
我們現(xiàn)在寫(xiě)一個(gè)dockerfile 來(lái)提取并復(fù)制這幾個(gè)層來(lái)構(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"]
這是一個(gè)多階段的docker 文件,他builder 提取了需要的文件,就是前面我們拆掉的四個(gè)層。全給他弄進(jìn)去
然后我們開(kāi)始構(gòu)建
docker build . --tag demo
構(gòu)建完了,我們就跑他一下
docker run -it -p8080:8080 demo:latest
到此這篇關(guān)于詳解如何用SpringBoot 2.3.0.M1創(chuàng)建Docker映像的文章就介紹到這了,更多相關(guān)SpringBoot 2.3.0.M1創(chuàng)建Docker映像內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Maven一鍵部署Springboot到Docker倉(cāng)庫(kù)為自動(dòng)化做準(zhǔn)備(推薦)
- Linux+Docker+SpringBoot+IDEA一鍵自動(dòng)化部署的詳細(xì)步驟
- 詳解SpringBoot構(gòu)建Docker鏡像的3種方式
- 如何在docker中運(yùn)行springboot項(xiàng)目過(guò)程圖解
- IDEA連接遠(yuǎn)程服務(wù)器Docker部署Spring Boot項(xiàng)目的詳細(xì)教程
- 在Docker中開(kāi)發(fā)Java 8 Spring Boot應(yīng)用程序的方法
- 利用Dockerfile部署SpringBoot項(xiàng)目的方法
- Springboot微服務(wù)打包Docker鏡像流程解析
相關(guān)文章
如何在Spring?Boot中使用OAuth2認(rèn)證和授權(quán)
這篇文章主要介紹了如何在Spring?Boot中使用OAuth2認(rèn)證和授權(quán)的相關(guān)資料,OAuth2.0是一種開(kāi)放的授權(quán)協(xié)議,它允許用戶(hù)授權(quán)第三方應(yīng)用訪問(wèn)其賬戶(hù)(或資源),而無(wú)需共享其用戶(hù)賬戶(hù)憑據(jù),需要的朋友可以參考下2023-12-12Spring中@PropertySource的使用方法和運(yùn)行原理詳解
這篇文章主要介紹了Spring中@PropertySource的使用方法和運(yùn)行原理詳解,PropertySource注解可以方便和靈活的向Spring的環(huán)境容器(org.springframework.core.env.Environment?Environment)中注入一些屬性,這些屬性可以在Bean中使用,需要的朋友可以參考下2023-11-11java中MultipartFile互轉(zhuǎn)File的方法
本文主要介紹了java中MultipartFile互轉(zhuǎn)File的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10Java?Web實(shí)現(xiàn)簡(jiǎn)易圖書(shū)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java?Web實(shí)現(xiàn)簡(jiǎn)易圖書(shū)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-09-09shrio中hashedCredentialsMatcher密碼匹配示例詳解
shrio是一個(gè)輕量級(jí)權(quán)限管理框架,密碼的匹配由框架內(nèi)部完成。密碼是否匹配由接口CredentialsMatcher定義實(shí)現(xiàn)類(lèi)完成,CredentialsMatcher實(shí)現(xiàn)類(lèi)有SimpleCredentialsMatcher和HashedCredentialsMatcher兩個(gè)2021-10-10java集合與數(shù)組的相同點(diǎn)和不同點(diǎn)
今天小編就為大家分享一篇關(guān)于java集合與數(shù)組的相同點(diǎn)和不同點(diǎn),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-04-04