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

一文弄懂docker的緩存機(jī)制

 更新時(shí)間:2024年06月23日 09:19:18   作者:Cherry Xie  
Docker的緩存機(jī)制是指當(dāng)你構(gòu)建鏡像時(shí),Docker會(huì)盡可能重用之前步驟的輸出,本文主要介紹了一文弄懂docker的緩存機(jī)制,具有一定的參考價(jià)值,感興趣的可以了解一下

docker文檔

docker的緩存機(jī)制

鏡像層緩存(Image Layer Cache)

Docker 鏡像是分層構(gòu)建的,每一個(gè) Dockerfile 指令都會(huì)生成一個(gè)新的鏡像層。
Docker 會(huì)緩存每一個(gè)鏡像層,當(dāng)構(gòu)建新的鏡像時(shí),如果檢測(cè)到某個(gè)層之前已經(jīng)構(gòu)建過(guò),就會(huì)直接復(fù)用該層,而不需要重新構(gòu)建。

FROM ubuntu:18.04
RUN apt-get update
RUN apt-get install -y nginx
COPY app/ /var/www/html/
CMD ["nginx", "-g", "daemon off;"]

在上面的 Dockerfile 中, 前兩個(gè) RUN 指令對(duì)應(yīng)的鏡像層會(huì)被緩存。當(dāng)再次構(gòu)建鏡像時(shí),如果這兩個(gè)層沒(méi)有變化,Docker 就會(huì)直接復(fù)用緩存,而不需要重新執(zhí)行這兩條命令,大大加快了構(gòu)建速度。

容器層緩存(Container Layer Cache)

每個(gè)容器都有自己的可寫容器層,位于鏡像層之上,用于存儲(chǔ)容器的動(dòng)態(tài)數(shù)據(jù)。
Docker 也會(huì)緩存容器層,當(dāng)重新啟動(dòng)容器時(shí),Docker 會(huì)復(fù)用之前的容器層,避免重新創(chuàng)建。

# 創(chuàng)建并啟動(dòng)容器
docker run -d --name my-app my-app:v1

# 停止并重啟容器
docker stop my-app
docker start my-app

在上面的示例中,當(dāng)我們停止并重啟容器時(shí),Docker 會(huì)復(fù)用之前的容器層,避免了重新創(chuàng)建容器的開(kāi)銷,使容器啟動(dòng)速度更快。

構(gòu)建緩存(Build Cache)

Docker 還提供了一個(gè)專門的構(gòu)建緩存機(jī)制,可以進(jìn)一步優(yōu)化鏡像構(gòu)建過(guò)程。
構(gòu)建緩存會(huì)將之前構(gòu)建過(guò)程中用到的中間層緩存起來(lái),下次構(gòu)建時(shí)如果檢測(cè)到相同的指令,就會(huì)復(fù)用這些緩存層。
用戶可以通過(guò)設(shè)置 --cache-from 參數(shù)來(lái)指定需要復(fù)用的緩存層。

# 構(gòu)建鏡像時(shí)啟用構(gòu)建緩存
docker build --cache-from my-app:v1 -t my-app:v2 .

在上面的示例中,我們指定了 --cache-from my-app:v1 參數(shù),告訴 Docker 復(fù)用之前構(gòu)建 my-app:v1 時(shí)使用的緩存層,這樣可以進(jìn)一步加快構(gòu)建速度。

Registry 緩存

Docker Registry 也提供了緩存機(jī)制,可以緩存之前拉取的鏡像層,下次拉取時(shí)直接從緩存中獲取,提高拉取速度。
這種緩存機(jī)制對(duì)于分布式環(huán)境下的鏡像分發(fā)非常有用,可以減輕 Registry 服務(wù)器的壓力。

綜上所述,Docker 的緩存機(jī)制涵蓋了鏡像層、容器層、構(gòu)建過(guò)程以及 Registry 等多個(gè)方面,充分利用緩存可以大幅提升 Docker 的性能和效率。如果您還有其他問(wèn)題,歡迎繼續(xù)提出

docker的幾種寫法

指令順序優(yōu)化

  • Dockerfile 中指令的順序非常重要,因?yàn)?Docker 是根據(jù)指令順序來(lái)構(gòu)建鏡像層的。
  • 通常將較穩(wěn)定不變的指令放在前面,易變的指令放在后面,這樣可以最大限度地利用緩存。

例如:

# 不好的寫法
RUN apt-get update
COPY . /app
RUN pip install -r requirements.txt

# 更好的寫法  
FROM python:3.9
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .

在第二個(gè)例子中,我們先復(fù)制 requirements.txt 并安裝依賴包,這部分內(nèi)容相對(duì)穩(wěn)定,可以很好地利用緩存。而后面的 COPY . . 指令是最易變的,放在最后可以最大化利用緩存。

分層構(gòu)建

  • 充分利用 Docker 的分層特性,把 Dockerfile 拆分成多個(gè)階段,每個(gè)階段構(gòu)建一部分功能。
  • 這樣可以確保穩(wěn)定的基礎(chǔ)層能夠最大化利用緩存,而變更的部分只需重新構(gòu)建對(duì)應(yīng)層即可。

例如:

# 基礎(chǔ)層
FROM ubuntu:18.04
RUN apt-get update && apt-get install -y nodejs npm

# 應(yīng)用層  
FROM base-image
COPY . /app
WORKDIR /app
RUN npm install
CMD ["node", "server.js"]

在這個(gè)例子中,我們將 Dockerfile 劃分為兩個(gè)階段:基礎(chǔ)層和應(yīng)用層?;A(chǔ)層負(fù)責(zé)安裝 Node.js 環(huán)境,這部分內(nèi)容相對(duì)穩(wěn)定,可以很好地利用緩存。應(yīng)用層則負(fù)責(zé)復(fù)制源代碼并安裝依賴,這部分內(nèi)容更容易變更。

多階段構(gòu)建

  • Docker 17.05 版本引入了多階段構(gòu)建的功能,可以進(jìn)一步優(yōu)化鏡像大小和構(gòu)建過(guò)程。
  • 通過(guò)在 Dockerfile 中定義多個(gè) FROM 指令,可以實(shí)現(xiàn)將構(gòu)建過(guò)程拆分為多個(gè)獨(dú)立的階段。

例如:

# 構(gòu)建階段
FROM golang:1.16 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp

# 運(yùn)行階段 
FROM alpine:latest
COPY --from=builder /app/myapp /myapp
CMD ["/myapp"]

在這個(gè)例子中,我們先在 builder 階段編譯 Go 代碼,然后在 runtime 階段只復(fù)制編譯好的二進(jìn)制文件到最終鏡像中。這種方式可以大幅減小最終鏡像的體積,同時(shí)也能很好地利用緩存。

關(guān)于docker的builder階段

在多階段構(gòu)建的場(chǎng)景中,即使在 builder 階段復(fù)制了源代碼,最終也只會(huì)把編譯好的二進(jìn)制文件復(fù)制到運(yùn)行時(shí)容器中。這是因?yàn)?COPY --from=builder 指令會(huì)選擇性地復(fù)制指定階段的文件。

讓我們更詳細(xì)地解釋一下:

  • 在 builder 階段,我們將源代碼復(fù)制到工作目錄并執(zhí)行編譯命令go build。此時(shí),容器中包含了源代碼和編譯好的二進(jìn)制文件。
  • 在 runtime 階段,我們使用 COPY --from=builder 指令從 builder 階段復(fù)制二進(jìn)制文件 /app/myapp 到當(dāng)前容器的 /myapp 路徑。
  • 這樣做的好處是:
    1、 只將最終需要的二進(jìn)制文件復(fù)制到運(yùn)行時(shí)容器中,大大減小了鏡像大小。
    2、builder 階段的源代碼和編譯過(guò)程不會(huì)被帶入到最終鏡像中,從而避免了不必要的信息泄露。

在多階段構(gòu)建中,builder 階段的源代碼確實(shí)會(huì)被保存下來(lái),但不會(huì)被包含在最終的容器鏡像中。這里有幾點(diǎn)需要說(shuō)明:

Docker 緩存

  • Docker 在構(gòu)建鏡像時(shí)會(huì)利用緩存機(jī)制,加快后續(xù)鏡像的構(gòu)建過(guò)程。
  • 這意味著 builder 階段產(chǎn)生的中間層鏡像會(huì)被暫時(shí)保留在本地 Docker 環(huán)境中,以便后續(xù)構(gòu)建時(shí)復(fù)用。

最終鏡像

  • 通過(guò) COPY --from=builder 指令,只有 builder 階段產(chǎn)出的二進(jìn)制文件會(huì)被復(fù)制到最終的運(yùn)行時(shí)容器中。
  • 源代碼和編譯過(guò)程中產(chǎn)生的其他文件不會(huì)被包含在最終鏡像中。

開(kāi)發(fā)與部署分離

  • 多階段構(gòu)建的一個(gè)重要目的就是將開(kāi)發(fā)和部署環(huán)境進(jìn)行分離。
  • 開(kāi)發(fā)階段的源代碼和構(gòu)建過(guò)程保留在 builder 容器中,不會(huì)泄露到最終的部署容器中。

到此這篇關(guān)于一文弄懂docker的緩存機(jī)制的文章就介紹到這了,更多相關(guān)docker 緩存機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • Windows10系統(tǒng)下Docker默認(rèn)存儲(chǔ)位置更改方案

    Windows10系統(tǒng)下Docker默認(rèn)存儲(chǔ)位置更改方案

    這篇文章主要給大家介紹了關(guān)于Windows10系統(tǒng)下Docker默認(rèn)存儲(chǔ)位置更改方案的相關(guān)資料,在Docker中存儲(chǔ)路徑是一個(gè)重要的話題,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-08-08
  • Docker使用Portainer搭建可視化界面的方法

    Docker使用Portainer搭建可視化界面的方法

    這篇文章主要介紹了Docker使用Portainer搭建可視化界面,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • centOS中安裝docker-composer時(shí)報(bào)錯(cuò)問(wèn)題及解決

    centOS中安裝docker-composer時(shí)報(bào)錯(cuò)問(wèn)題及解決

    這篇文章主要介紹了centOS中安裝docker-composer時(shí)報(bào)錯(cuò)問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • harbor修改配置文件后重啟操作

    harbor修改配置文件后重啟操作

    這篇文章主要介紹了harbor修改配置文件后重啟操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • Docker搭建OpenLDAP+phpLDAPadmin統(tǒng)一用戶認(rèn)證的方法

    Docker搭建OpenLDAP+phpLDAPadmin統(tǒng)一用戶認(rèn)證的方法

    這篇文章主要介紹了Docker搭建OpenLDAP+phpLDAPadmin統(tǒng)一用戶認(rèn)證,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Docker設(shè)置獲取環(huán)境變量的方法實(shí)現(xiàn)

    Docker設(shè)置獲取環(huán)境變量的方法實(shí)現(xiàn)

    本文主要介紹了Docker設(shè)置獲取環(huán)境變量的方法實(shí)現(xiàn),包含設(shè)置環(huán)境變量到使用獲取,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • Docker Desktop啟動(dòng)后容器自啟動(dòng)關(guān)閉指南

    Docker Desktop啟動(dòng)后容器自啟動(dòng)關(guān)閉指南

    在使用 Docker Desktop 的時(shí)候,有些容器會(huì)在每次啟動(dòng) Docker Desktop 后自動(dòng)啟動(dòng),但是這個(gè)服務(wù)我并不是每次都需要用,所以希望它不要跟隨 Docker Desktop 自動(dòng)啟動(dòng),而是在需要的時(shí)候手動(dòng)啟動(dòng),所以本文給大家介紹了Docker Desktop啟動(dòng)后容器自啟動(dòng)關(guān)閉方法
    2026-06-06
  • 如何解決Docker連接本地MySQL服務(wù)失敗的問(wèn)題

    如何解決Docker連接本地MySQL服務(wù)失敗的問(wèn)題

    這篇文章主要介紹了如何解決Docker連接本地MySQL服務(wù)失敗的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-06-06
  • 關(guān)于Jenkins + Docker + ASP.NET Core自動(dòng)化部署的問(wèn)題(避免踩坑)

    關(guān)于Jenkins + Docker + ASP.NET Core自動(dòng)化部署的問(wèn)題(避免踩坑)

    這篇文章主要介紹了關(guān)于Jenkins + Docker + ASP.NET Core自動(dòng)化部署的問(wèn)題,本文給大家?guī)?lái)了docker安裝方法及一些注意事項(xiàng),內(nèi)容有點(diǎn)小長(zhǎng),希望朋友們耐心看完,一定有收獲
    2021-05-05
  • docker rm -f 容器id 無(wú)效的問(wèn)題解決

    docker rm -f 容器id 無(wú)效的問(wèn)題解決

    當(dāng)遇到“Error response from daemon: cannot stop container: d208b8055fd0: permission denied”錯(cuò)誤,表示缺乏停止Docker容器的權(quán)限,本文就來(lái)介紹一下如何解決,感興趣的可以了解一下
    2024-09-09

最新評(píng)論

旬邑县| 邓州市| 珠海市| 集安市| 商南县| 犍为县| 大名县| 枣庄市| 潼南县| 华阴市| 神木县| 宁津县| 图木舒克市| 赣州市| 吉林市| 白玉县| 若尔盖县| 年辖:市辖区| 朝阳区| 聂拉木县| 广宗县| 吴江市| 通海县| 桓台县| 德兴市| 崇仁县| 志丹县| 无为县| 山阴县| 西和县| 额济纳旗| 内江市| 运城市| 上思县| 兴义市| 南和县| 大石桥市| 沁源县| 永寿县| 平凉市| 固安县|