溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何使用Docker優(yōu)化Spring Boot應(yīng)用程序

發(fā)布時(shí)間:2021-12-13 15:46:18 來源:億速云 閱讀:203 作者:iii 欄目:互聯(lián)網(wǎng)科技

本篇內(nèi)容主要講解“如何使用Docker優(yōu)化Spring Boot應(yīng)用程序”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“如何使用Docker優(yōu)化Spring Boot應(yīng)用程序”吧!

Docker功能強(qiáng)大且易于使用。Docker允許開發(fā)人員研制的軟件創(chuàng)建可移植的鏡像。這些鏡像可重復(fù)地部署。你可以很容易地從Docker中獲得很多價(jià)值,但是要從Docker中獲得最大的價(jià)值,需要理解一些概念。在進(jìn)行持續(xù)集成和持續(xù)交付時(shí),如何構(gòu)建Docker鏡像具有重要的作用。在本文中,我將重點(diǎn)介紹:

  • 在進(jìn)行迭代開發(fā)和部署時(shí),如何采用更有效的方法為Spring Boot應(yīng)用程序構(gòu)建Docker鏡像。

  • 為Spring Boot應(yīng)用程序構(gòu)建Docker鏡像的標(biāo)準(zhǔn)方法有一些缺點(diǎn),因此在這里我們要介紹如何做得更好。

Docker關(guān)鍵概念

Docker有四個(gè)關(guān)鍵概念:images, layers, Dockerfile 和 Docker cache  。簡而言之,Dockerfile描述了如何構(gòu)建Docker鏡像。鏡像由許多層組成。Dockerfile從基礎(chǔ)鏡像開始,并添加了其他層。當(dāng)新內(nèi)容添加到鏡像時(shí),將生成一個(gè)新層。所構(gòu)建的每個(gè)層都被緩存,因此可以在后續(xù)構(gòu)建中重復(fù)使用。當(dāng)Docker構(gòu)建運(yùn)行時(shí),它可以從緩存中獲取重復(fù)使用任何已有層。這就減少了每次構(gòu)建所需的時(shí)間和空間。任何已更改或以前尚未構(gòu)建的內(nèi)容都將根據(jù)需要進(jìn)行構(gòu)建。

如何使用Docker優(yōu)化Spring Boot應(yīng)用程序

Docker更新頻率

鏡像層內(nèi)容很重要

鏡像各層的重要性。Docker緩存中的現(xiàn)有層,只有當(dāng)改鏡像層內(nèi)容沒有變更時(shí),才能被使用。在Docker構(gòu)建期間更改的層越多,Docker需要執(zhí)行更多的工作來重建鏡像。鏡像層順序也很重要。如果某個(gè)圖層的所有父圖層均未更改,則該圖層就能被重用。因此,最好把比較頻繁更改的圖層放在上面,以便對(duì)其更改會(huì)影響較少的子圖層。鏡像層的順序和內(nèi)容很重要。當(dāng)你把應(yīng)用程序打包為Docker鏡像時(shí),最簡單的方法是將整個(gè)應(yīng)用程序放置到一個(gè)單獨(dú)的鏡像層中。但是,如果該應(yīng)用程序包含大量靜態(tài)庫依賴,那么即使更改很少的代碼,也需要重新構(gòu)建整個(gè)鏡像層。這就需要在Docker緩存中,花費(fèi)大量構(gòu)建時(shí)間和空間。

鏡像層影響部署

部署Docker鏡像時(shí),鏡像層也很重要。在部署Docker鏡像之前,它們會(huì)被推送到Docker遠(yuǎn)程倉庫。該倉庫是所有部署鏡像的源頭,并且經(jīng)常包含同一鏡像的許多版本。Docker非常高效,每個(gè)層僅存儲(chǔ)一次。但是,對(duì)于頻繁部署且具有不斷重建的大體積層的鏡像,這就不行了。大體積層的鏡像,即使內(nèi)部只有很少的更改,也必須單獨(dú)存儲(chǔ)在倉庫中并在網(wǎng)絡(luò)中推送。因?yàn)樾枰苿?dòng)并存儲(chǔ)不變的內(nèi)容,這就會(huì)增加部署時(shí)間,

Docker中的Spring Boot應(yīng)用

使用uber-jar方法的Spring  Boot應(yīng)用程序本身就是獨(dú)立的部署單元。該模型非常適合在虛擬機(jī)或構(gòu)建包上進(jìn)行部署,因?yàn)樵搼?yīng)用程序可帶來所需的一切。但是,這對(duì)Docker部署是一個(gè)缺點(diǎn):Docker已經(jīng)提供了打包依賴項(xiàng)的方法。將整個(gè)Spring  Boot JAR放入Docker鏡像是很常見的,但是,這會(huì)導(dǎo)致Docker鏡像的應(yīng)用程序?qū)又械牟蛔儍?nèi)容太多。

如何使用Docker優(yōu)化Spring Boot應(yīng)用程序

Java SpringBoot單層

Spring社區(qū)中正在進(jìn)行有關(guān)減少運(yùn)行Spring  Boot應(yīng)用程序時(shí)的部署大小和時(shí)間的討論,尤其是在Docker中。在我看來,這最終是在簡單性與效率之間進(jìn)行權(quán)衡。為Spring  Boot應(yīng)用程序構(gòu)建Docker鏡像的最常見方法是我所說的“單層”方法。從技術(shù)上講,這不是正確的,因?yàn)镈ockerfile實(shí)際上創(chuàng)建了多個(gè)層,但是對(duì)于討論來說已經(jīng)足夠了。

單層方法

讓我們看一下單層方法。單層方法快速,簡單,易于理解和使用。Docker的Spring Boot指南  列出了單層Dockerfile來構(gòu)建你的Docker鏡像:

FROM openjdk:8-jdk-alpine VOLUME /tmp ARG JAR_FILE COPY ${JAR_FILE} app.jar ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

它的最終結(jié)果是一個(gè)正常運(yùn)行的Docker鏡像,其運(yùn)行方式與你期望Spring  Boot應(yīng)用程序運(yùn)行的方式完全相同。但是,由于它基于整個(gè)應(yīng)用程序JAR,因此存在分層效率問題。隨著應(yīng)用程序源的更改,整個(gè)Spring Boot  JAR都會(huì)被重建。下次構(gòu)建Docker鏡像時(shí),將重新構(gòu)建整個(gè)應(yīng)用程序?qū)樱ㄋ胁蛔兊囊蕾噹?。讓我們看一個(gè)具體的例子, Spring Pet  Clinic。

更深入地研究單層方法

單層方法使用Open Boot JDK基礎(chǔ)鏡像之上的Spring Boot JAR作為Docker層構(gòu)建Docker鏡像:

$ docker images REPOSITORY                    TAG         IMAGE ID            CREATED             SIZE springio/spring-petclinic     latest      94b0366d5ba2        16 seconds ago      140MB

生成的Docker鏡像為140 MB。你可以使用docker history 命令檢查圖層 。你可以看到Spring  Boot應(yīng)用程序JAR已復(fù)制到鏡像中,大小為38.3 MB。

$ docker history springio/spring-petclinic IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT 94b0366d5ba2        52 seconds ago      /bin/sh -c #(nop)  ENTRYPOINT ["java" "-Djav&hellip;   0B 213dff56a4bd        53 seconds ago      /bin/sh -c #(nop) COPY file:d3551559c2aa35af&hellip;   38.3MB bc453a32748e        6 minutes ago       /bin/sh -c #(nop)  ARG JAR_FILE                 0B 7fe0bb0d8026        6 minutes ago       /bin/sh -c #(nop)  VOLUME [/tmp]                0B cc2179b8f042        8 days ago          /bin/sh -c set -x  && apk add --no-cache   o&hellip;   97.4MB <missing>           8 days ago          /bin/sh -c #(nop)  ENV JAVA_ALPINE_VERSION=8&hellip;   0B <missing>           8 days ago          /bin/sh -c #(nop)  ENV JAVA_VERSION=8u151       0B <missing>           8 days ago          /bin/sh -c #(nop)  ENV PATH=/usr/local/sbin:&hellip;   0B <missing>           8 days ago          /bin/sh -c #(nop)  ENV JAVA_HOME=/usr/lib/jv&hellip;   0B <missing>           8 days ago          /bin/sh -c {   echo '#!/bin/sh';   echo 'set&hellip;   87B <missing>           8 days ago          /bin/sh -c #(nop)  ENV LANG=C.UTF-8             0B <missing>           5 months ago        /bin/sh -c #(nop)  CMD ["/bin/sh"]              0B <missing>           5 months ago        /bin/sh -c #(nop) ADD file:093f0723fa46f6cdb&hellip;   4.15MB

下次構(gòu)建Docker鏡像時(shí),將重新創(chuàng)建整個(gè)38  MB的層,因?yàn)橹匦麓虬薐AR文件。在此示例中,應(yīng)用程序的大小相對(duì)較小(因?yàn)閮H基于spring-boot-starter-web和其他依賴項(xiàng),例如spring-actuator)。在實(shí)際開發(fā)中,這些大小通常要大得多,因?yàn)樗鼈儾粌H包括Spring  Boot庫,還包括其他第三方庫。根據(jù)我的經(jīng)驗(yàn),實(shí)際的Spring Boot應(yīng)用程序的大小范圍可能在50 MB到250  MB之間(如果不是更大的話)。仔細(xì)觀察該應(yīng)用程序,應(yīng)用程序JAR中只有372 KB是應(yīng)用程序代碼。其余38  MB是依賴庫。這意味著實(shí)際上只有0.1%的層在變化。其余99.9%不變。

鏡像層生命周期

這是基于鏡像層的基本考慮:內(nèi)容的生命周期。鏡像層的內(nèi)容應(yīng)具有相同的生命周期。Spring  Boot應(yīng)用程序的內(nèi)容有兩個(gè)不同的生命周期:不經(jīng)常更改的依賴庫和經(jīng)常更改的應(yīng)用程序類。每次由于應(yīng)用程序代碼更改而重建該層時(shí),也會(huì)包含不變的二進(jìn)制文件。在快速的應(yīng)用程序開發(fā)環(huán)境中,不斷更改和重新部署應(yīng)用程序代碼,這種附加成本可能變得非常昂貴。想象一個(gè)應(yīng)用團(tuán)隊(duì)在Pet  Clinic上進(jìn)行迭代。團(tuán)隊(duì)每天更改和重新部署應(yīng)用程序10次。這10個(gè)新層的成本為每天383 MB。如果使用更多實(shí)際大小,則每天最多可以達(dá)到2.5  GB或更多。最終將浪費(fèi)大量的構(gòu)建時(shí)間,部署時(shí)間和Docker倉庫空間。快速迭代的開發(fā)和交付是決定我們是繼續(xù)使用簡單的單層方法,還是采用更有效的替代方法。

擁抱Docker,進(jìn)入雙層

在簡單性和效率之間進(jìn)行權(quán)衡時(shí),我認(rèn)為正確的選擇是“雙層”方法。(可以有更多的層,但是太多的層可能有害,并且違反了  Docker最佳實(shí)踐)。在雙層方法中,我們構(gòu)建Docker鏡像,以使Spring  Boot應(yīng)用程序的依賴庫,存在于應(yīng)用程序代碼下方的一層中。這樣,各層將遵循內(nèi)容的不同生命周期。通過將不經(jīng)常更改的依賴庫推入一個(gè)單獨(dú)的層,并僅將應(yīng)用程序類保留在頂層,那么迭代重建和重新部署就會(huì)更快。

如何使用Docker優(yōu)化Spring Boot應(yīng)用程序

Java Spring Boot雙層

雙層方法加快了迭代開發(fā)的速度,并最大程度地縮短了部署時(shí)間。當(dāng)然實(shí)際效率因應(yīng)用程序而異,但是平均而言,這將使應(yīng)用程序部署大小減少90%,同時(shí)相應(yīng)地縮短了部署周期。

到此,相信大家對(duì)“如何使用Docker優(yōu)化Spring Boot應(yīng)用程序”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI