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

Docker鏡像優(yōu)化打包速度思考

 更新時間:2023年05月08日 10:24:27   作者:在下uptown  
本文主要介紹了Docker鏡像優(yōu)化打包速度思考,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

image.png

當(dāng)下主流的業(yè)務(wù)架構(gòu)大部分會選擇用容器進(jìn)行部署,并結(jié)合一些容器編排技術(shù)k8s技術(shù)。由于公司業(yè)務(wù)調(diào)整,jenkins打包的工作交付到我這邊來負(fù)責(zé)。

結(jié)果組長上來就給我一個當(dāng)頭一棒,打包速度太慢,盡量優(yōu)化下。我尋思過年也沒忘記給拜年啊,不行把送出去的特產(chǎn)要回來吧,沒啥用啊,凈給整這一出。

說歸說鬧歸鬧,別拿績效開玩笑,畢竟這年終還沒發(fā)呢,該忍還得忍。君讓臣死,臣不得不死,硬著頭皮上吧

壓縮鏡像大小

優(yōu)化第一步,瘦身,docker images查看了下基礎(chǔ)服務(wù)的鏡像大小,好家伙沒有小于300M的,一個普通的小服務(wù)都要300多,顯然在鏡像體積上可以做做文章。

在Docker官方的建議中有一個點(diǎn),使用更小的基礎(chǔ)鏡像。而在小的基礎(chǔ)鏡像中全網(wǎng)的一致答案都是alpine了。

alpine是一個非常特別的Linux版本,大小才5M左右,最早適用于嵌入式系統(tǒng),但隨著容器的流行,這個才5M大小的Linux在Docker中流行起來了,因?yàn)樘×?,非常?jié)省空間。

這里就對比下同樣屬于Linux鏡像centeros與alpine的大小

REPOSITORY TAG IMAGE ID CREATED SIZE
alpine 3.16.2 9c6f07244728 7 days ago 5.54MB
centeros latest df5de72bdb3b 2 weeks ago 77.8MB

解決完基礎(chǔ)鏡像再來研究下第三方包是不是有可優(yōu)化的點(diǎn),仔細(xì)分析Dockerfile發(fā)現(xiàn)在構(gòu)建過程中去拉代碼打包的,那么構(gòu)建過程中就會存在大量運(yùn)行時不需要的包。這部分清掉基本上就可以瘦身成功了。

構(gòu)建過程中,通過apk安裝軟件包時,可以指定虛擬包.build-deps,這樣git之類的工具歸屬到虛擬包下,由于僅是構(gòu)建階段用到的命令,如執(zhí)行npm installpip install,當(dāng)把項(xiàng)目構(gòu)建完以后,通過apk del .build-deps清理掉所有臨時命令即可。

這樣就可以保證構(gòu)建出的鏡像最小了。

利用緩存加速打包速度

docker本身是有緩存機(jī)制的,也就是每次build的時候會檢查Dockerfile是否發(fā)生了變更,這里要注意是Dockerfile發(fā)生了變更,并不是代碼發(fā)生變更。

得到這個結(jié)論的時候其實(shí)我是很迷惑的,照這么來說的話,Dockefile基本不會變,每次走緩存為什么jenkins打包速度這么慢呢。

后來在build命令里發(fā)現(xiàn)了端倪,有人在docker build時加了--no-cache參數(shù),因?yàn)榇a是在鏡像構(gòu)建時拉取的,每次走了緩存那么代碼就不會拉取了,每次都會走緩存。所以為了避免代碼不對運(yùn)維在命令里加了--no-cache

那怎么辦呢,因?yàn)镈ockefile執(zhí)行從上到下依次執(zhí)行。把代碼放到最低端,通過定義隨機(jī)數(shù)或時間戳的方式使拉代碼的命令緩存失效而不影響上面的第三方包的安裝。

42ce9b8428f6effa08aa41798c5e798.jpg

豈不美哉。

Multi-stage Build

Docker 提供了 Multi-stage Build(多階段構(gòu)建),可以實(shí)現(xiàn)鏡像瘦身。

我們將鏡像構(gòu)建分成兩個階段:

在 ”build“ 階段依然采用 JDK 作為基礎(chǔ)鏡像,并利用 Maven 進(jìn)行應(yīng)用構(gòu)建; 在最終發(fā)布的鏡像中,我們會采用 JRE 版本作為基礎(chǔ)鏡像,并從”build“ 鏡像中直接拷貝出生成的 jar 文件。這意味著在最終發(fā)布的鏡像中,只包含運(yùn)行時所需必要內(nèi)容,不包含任何編譯時依賴,大大減少了鏡像體積。

FROM adoptopenjdk/openjdk8 AS build
RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/' /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y \
git \
maven
WORKDIR /tmp
RUN git clone https://github.com/spring-projects/spring-petclinic.git
WORKDIR /tmp/spring-petclinic
RUN mvn install
FROM adoptopenjdk/openjdk8:jre8u222-b10-alpine-jre
COPY --from=build /tmp/spring-petclinic/target/spring-petclinic-2.1.0.BUILD-SNAPSHOT.jar spring-petclinic-2.1.0.BUILD-SNAPSHOT.jar
CMD ["java","-jar","spring-petclinic-2.1.0.BUILD-SNAPSHOT.jar"]

Java打包測試

springboot背景下,在默認(rèn)的maven打包插件加入分層打包配置

????<build>
????????<plugins>
????????????<plugin>
????????????????<groupId>org.springframework.boot</groupId>
????????????????<artifactId>spring-boot-maven-plugin</artifactId>
????????????????<configuration>
????????????????????<layers>
????????????????????????<enabled>true</enabled>
????????????????????</layers>
????????????????</configuration>
????????????</plugin>
????????</plugins>
????</build>

再次進(jìn)行打包分析操作mvn clean package,現(xiàn)在我們可以用下面命令來看分層打包編譯的jar包結(jié)構(gòu) java -Djarmode=layertools -jar target/dockers-demo-0.0.1-SNAPSHOT.jar list

圖片

可以看到layertools識別出jar包內(nèi)將依賴打包到不同文件夾中,接下來我們改造下原有的dockerfile。

如果不分層打包的話,一次全量包會特別大。如果只更改部分代碼的話。

FROM?openjdk:8?as?builder
RUN?mvn?clean?package?-DskipTests
#?聲明端口并沒有真正運(yùn)行在這個端口
EXPOSE?8080
ADD?./target/*.jar?./app.jar
RUN?java?-Djarmode=layertools?-jar?app.jar?extract
FROM?openjdk:8-jre
MAINTAINER?ttzommed@foxmail.com
WORKDIR?application
#?復(fù)制第三方依賴、SpringBoot內(nèi)部配置、快照依賴
COPY?--from=builder?application/dependencies/?./
COPY?--from=builder?application/spring-boot-loader/?./
COPY?--from=builder?application/snapshot-dependencies/?./
COPY?--from=builder?application/application/?./
EXPOSE?8080
ENTRYPOINT?["java",?"org.springframework.boot.loader.JarLauncher"]

依靠docker的分層特征,分次加入文件即可達(dá)到分層加速打包的效果

到此這篇關(guān)于Docker鏡像優(yōu)化打包速度思考的文章就介紹到這了,更多相關(guān)Docker鏡像打包優(yōu)化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 常用的Docker命令及示例匯總分析

    常用的Docker命令及示例匯總分析

    這篇文章主要介紹了常用的Docker命令及示例的匯總分析,附含源碼示例分析,有需要的朋友可以借鑒參考下,希望可以對廣大讀者有所幫助
    2021-09-09
  • 深入理解docker的四種網(wǎng)絡(luò)方式

    深入理解docker的四種網(wǎng)絡(luò)方式

    本篇文章主要介紹了深入理解docker的四種網(wǎng)絡(luò)方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • Vue.js中的watch屬性詳解

    Vue.js中的watch屬性詳解

    在Vue.js中,watch屬性是一種非常重要的屬性,它可以監(jiān)聽Vue實(shí)例中指定的數(shù)據(jù)變化,并在數(shù)據(jù)發(fā)生變化時執(zhí)行相應(yīng)的操作,本文將對 Vue.js中的watch屬性進(jìn)行詳細(xì)的介紹,并附上相關(guān)的代碼示例,需要的朋友可以參考下
    2023-06-06
  • docker中運(yùn)行PostgreSQL容器的簡單步驟

    docker中運(yùn)行PostgreSQL容器的簡單步驟

    這篇文章主要給大家介紹了關(guān)于docker中運(yùn)行PostgreSQL容器的簡單步驟,隨著docker的廣泛應(yīng)用,為了提供便利的管理,PostgreSQL數(shù)據(jù)庫也支持docker的安裝方式,需要的朋友可以參考下
    2023-08-08
  • 在Docker中的ubuntu中安裝Python3和Pip的問題

    在Docker中的ubuntu中安裝Python3和Pip的問題

    這篇文章主要介紹了在Docker中的ubuntu中安裝Python3和Pip的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • Docker創(chuàng)建Mysql容器的簡單步驟

    Docker創(chuàng)建Mysql容器的簡單步驟

    這篇文章主要給大家介紹了關(guān)于Docker創(chuàng)建Mysql容器的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Docker具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Docker?配置容器固定IP的方法

    Docker?配置容器固定IP的方法

    這篇文章主要介紹了Docker?配置容器固定IP,下面使用docker自帶的network實(shí)現(xiàn)固定ip分配,并且重啟不會消失,通過綁定步驟給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2022-04-04
  • docker 動態(tài)映射運(yùn)行的container端口實(shí)例詳解

    docker 動態(tài)映射運(yùn)行的container端口實(shí)例詳解

    這篇文章主要介紹了 docker 動態(tài)映射運(yùn)行的container端口實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • Docker核心原理之 Cgroup詳解

    Docker核心原理之 Cgroup詳解

    cgroup的內(nèi)核通過hook鉤子來實(shí)現(xiàn)管理進(jìn)程資源,提供了一個統(tǒng)一的接口,從單個進(jìn)程的資源控制到操作系統(tǒng)層面的虛擬卡的過渡,今天通過本文給大家介紹Docker核心原理之 Cgroup詳解,需要的朋友參考下吧
    2021-07-07
  • Docker倉庫常用命令詳解

    Docker倉庫常用命令詳解

    這篇文章主要介紹了Docker倉庫常用命令詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10

最新評論

古蔺县| 中阳县| 乌兰察布市| 凌源市| 石家庄市| 罗甸县| 南雄市| 宁武县| 旌德县| 宜良县| 环江| 黔西县| 呼和浩特市| 湘西| 扶余县| 阳朔县| 安宁市| 福贡县| 临西县| 班戈县| 水城县| 正安县| 绥芬河市| 保康县| 衡水市| 美姑县| 新宁县| 赤壁市| 靖江市| 淮南市| 酒泉市| 合川市| 长垣县| 澳门| 西乡县| 永川市| 五大连池市| 阿克苏市| 麻阳| 枞阳县| 界首市|