您好,登錄后才能下訂單哦!
這篇文章主要介紹“優化docker鏡像構建過程”,在日常操作中,相信很多人在優化docker鏡像構建過程問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”優化docker鏡像構建過程”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
讓我們從Docker構建過程開始。Docker構建是通過使用Docker CLI工具中的docker build命令觸發。
docker build命令根據Dockerfile文件中指定的指令構建Docker鏡像。Dockerfile是一個文本文檔,其中包含用戶組裝鏡像所有的有序命令。
Docker鏡像由只讀層組成。每層代表一個Dockerfile指令。這些層是堆疊在一起的,每個層都是上一層的增量。我認為這些層是緩存的一種形式。對只更改了的層進行更新,而不是對每個更改進行更新。
下面的示例描述了Dockerfile的內容:
FROM ubuntu:18.04 COPY . /app RUN make /app CMD python /app/app.py
該文件中的每條指令代表Docker鏡像中的單獨一層。以下是每條指令的簡要說明:
FROM 使用ubuntu:18.04創建Docker鏡像的一個層
COPY 從Docker客戶端所在的目錄添加文件
RUN 使用make指令構建你的應用程序
CMD 指定在容器中運行什么命令
在構建過程中執行這四個命令時,它們將在Docker鏡像中創建層。
如果你想了解有關鏡像和層的更多信息,可以在此處閱讀有關它們的信息。
既然我們已經介紹了Docker的構建過程,我想分享一些優化建議,以幫助有效地構建鏡像。
1. 臨時容器
Dockerfile定義的鏡像應生成短暫的容器。
在這種情況下,臨時容器是指可以銷毀,重建,并可以替換為新容器。臨時容器可以認為是一次性的。每個實例都是新的,并且與以前的容器實例無關。
在開發Docker鏡像時,你應該利用盡可能多的臨時模式。
2. 不要安裝不必要的軟件包
盡量避免安裝不必要的文件和軟件包。
Docker鏡像應保持精簡,這有助于提高可移植性,縮短構建時間,降低復雜性并減小文件大小。例如,在大多數情況下,不要在容器上安裝文本編輯器,不要安裝任何非必需的應用程序或服務。
3. 實現.dockerignore文件
.dockerignore文件,是用來聲明不會被鏡像包括的文件和目錄。這有助于避免將不必要的大文件或敏感文件打包進去,并避免將它們添加到公共鏡像。
如果你也要排除與構建無關的文件而不重新構建源碼庫,請使用一個.dockerignore文件。它支持類似于.gitignore文件的排除模式。
4. 多行參數要排序
盡可能通過排序多行參數來簡化以后的更改,這有助于避免程序包重復,并使列表更易于更新。這也使PR易于閱讀和查看。在反斜杠\之前添加空格也有幫助。
5. 解耦應用
依賴于其他應用的應用程序被視為“耦合”。
在某些情況下,它們托管在同一主機或計算節點上,這在非容器部署中很常見,但對于微服務,每個應用程序應存在于其自己的單獨容器中。將應用程序解耦到多個容器中,可以更輕松地水平伸縮和重用容器。例如,一個解耦的Web應用程序可能包含三個單獨的容器,每個容器都有自己的唯一鏡像:一個用于管理Web應用程序,一個用于管理數據庫的容器以及一個用于管理緩存的容器。
將每個容器限制為一個進程是一個很好的經驗法則。根據你的最佳判斷,使容器盡可能保持干凈和模塊化。
如果容器相互依賴,則可以通過使用Docker容器網絡來確保這些容器可以通信。
6. 層數盡量少
Docker構建中,只有RUN,COPY和ADD指令創建圖層。其他指令會創建臨時的中間鏡像,最終不會增加構建的大小。
也可以將所需的組件復制到最終鏡像中,這會使你可以在構建階段中包含其他工具或調試信息,而無需增加最終鏡像的大小。
7. 利用構建緩存
在構建鏡像時,Docker會逐步、按順序執行Dockerfile中的每個指令。在每條指令中,Docker都會在其緩存中搜索要使用的鏡像,而不是創建新的鏡像。這是Docker遵循的基本規則:
從該基本鏡像派生的所有子鏡像,與已在緩存中的鏡像進行比較,以查看是否其中一個是使用完全相同的指令構建的。如果不一樣,則緩存失效,重新構建。
對于ADD和COPY指令,將檢查鏡像文件中的內容,并與現有鏡像中進行比較。如果文件中的任何內容(例如內容和元數據)發生了更改,則緩存將無效。
除了ADD和COPY命令之外,緩存不會查看容器中的文件,來確定緩存是否匹配。例如,在使用RUN apt-get -y命令時,不會檢查容器中的更新文件是否存在緩存中。
緩存無效后,后續所有Dockerfile命令都會生成新鏡像,并且不使用緩存。
首先,前面提到的所有優化概念對于在CI流水線中構建鏡像都是有效的。如果Dockerfile發生了變化,那么利用緩存仍然是減少構建時間的最佳方法。
當構建Docker鏡像是CI流水線的常規流程時,可以利用Docker層緩存(DLC)的功能來加快構建速度。DLC是一項很棒的功能。DLC會在任務中將創建的鏡像層保存,然后在后續的構建中重用未更改的鏡像層,而不是每次都重新構建整個鏡像。
DLC可與執行程序(machine executor)或遠程Docker環境(setup_remote_docker)一起使用。要注意的是,DLC僅在使用docker build,docker compose等命令創建Docker鏡像時很有用。
到此,關于“優化docker鏡像構建過程”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。