docker快取 Docker構建優化解析

2021-10-17 09:09:17 字數 2762 閱讀 5750

docker映象用作docker執行程式中的主映像。它們是容器的藍圖,提供了有關如何生成容器的說明。在本文中,我將介紹一些經常被忽視的概念,這些概念將有助於優化docker映象開發和構建過程。

讓我們從docker構建過程的簡短描述開始。這是通過使用docker cli工具執行docker build命令觸發的過程。

docker build命令根據dockerfile的檔案中指定的指令構建docker映象。dockerfile是乙個文字文件,其中包含使用者在命令列上調用以組裝映像的所有有序命令。

docker映象由唯讀層組成。每層代表乙個dockerfile指令。這些層是堆疊在一起的,每個層都是上一層的變化的增量。通常可以認為這些層是快取的一種形式。僅對更改的層進行更新,而不是對每個更改進行更新。

下面的示例描述了dockerfile的內容:

該檔案中的每條指令代表docker映象中的單獨一層。以下是每條指令的簡要說明:

from:從jdk建立乙個層docker映象,(此處的映象非docker hub上面直接拉取,而是基於原始碼自定義製作)

copy:從docker客戶端的當前目錄新增檔案

run:使用make構建您的應用程式

cmd:指定在容器中執行什麼命令

基於上述命令列,在構建過程中執行上述命令時,將在docker映象中建立層,乙個完整的docker映象將由此誕生。然而,在實際的專案活動中,我們需要從效能、穩定性、安全性等等方面對我們所建立的docker映象進行不斷的調整、優化,以滿足業務場景需求。

針對docker的構建過程,我想分享一些優化建議,以幫助有效地構建映象:

dockerfile定義的映象會生成短暫的容器。在這種情況下,臨時容器是指可以停放並銷毀,然後重建的容器,並使用絕對最小的設定和配置替換為新生成的容器。臨時容器可以認為是一次性的。每個例項都是新的,並且與以前的容器例項無關。在開發docker映象時,我們應該利用盡可能多的臨時模式。

盡量避免安裝不必要的檔案和軟體包。docker映象應保持精簡。這有助於提高可移植性,縮短構建時間,降低複雜性並減小檔案大小。例如,在大多數情況下,不需要在容器上安裝文字編輯器。不要安裝任何非必需的應用程式或服務。

.dockerignore檔案排除與在其中宣告的模式匹配的檔案和目錄。這有助於避免將不必要的大檔案或敏感檔案和目錄傳送到守護程式,並避免將它們新增到公共映象。

要在不重構源儲存庫的情況下排除與構建無關的檔案,請使用.dockerignore檔案。該檔案支援類似於.gitignore檔案的排除模式。

盡可能通過字母數字排序多行引數來簡化以後的更改。這有助於避免軟體包重複,並使列表更易於更新。

依賴於其他應用程式的應用程式被視為「已耦合」。在某些情況下,它們託管在同一主機或計算節點上。這在非容器部署中很常見,但對於微服務,每個應用程式應存在於其自己的單獨容器中。將應用程式解耦到多個容器中,可以更輕鬆地水平縮放和重用容器。例如,乙個解耦的web應用程式堆疊可能包含三個單獨的容器,每個容器都有自己的唯一映象:乙個用於管理web應用程式,乙個用於管理資料庫的容器以及乙個用於記憶體中快取的容器。將每個容器限制為乙個程序是乙個很好的經驗法則。根據業務規則,使容器保持清潔和模組化。然後,如果容器相互依賴,則可以使用docker容器網路來確保這些容器可以通訊。

僅使用run、copy和add等指令即可建立圖層。其他指令僅僅是建立臨時的中間映象,並且最終不會增加構建的大小。在可能的情況下,我們可以在構建過程中包含其他工具或者除錯資訊,而無需增加最終映象的大小。

在構建映象時,docker會逐步執行dockerfile中的指令,並按順序執行每個指令。在每條指令中,docker都會在其快取中搜尋要使用的現有映象,而不是建立新的重複映象。

docker映象通常在構建的過程中遵循以下基本規則:

1、從已在快取中的父映象開始,將下一條指令與從該基本映象派生的所有子映象進行比較,以檢視是否其中乙個是使用完全相同的指令構建的。如果不是,則快取記憶體無效。在大多數情況下,僅將dockerfile中的指令與子映象之一進行比較就足夠。

2、對於add和copy指令,將檢查映象中檔案的內容,並為每個檔案計算乙個校驗標識。在這些校驗標識中通常不考慮檔案的最後修改時間和最後訪問時間。在快取查詢期間,將校驗標識與現有映象中的進行比較。如果檔案中的任何內容(例如內容和元資料)發生了更改,則快取將無效。

3、除了add和copy命令外,快取檢查不會檢視容器中的檔案來確定快取是否匹配。例如,在處理run apt-get -y update命令時,不會檢查容器中更新的檔案以確定是否存在快取命中。在這種情況下,命令字串用於查詢匹配項。

4、快取無效後,所有後續dockerfile命令都會生成新映象,並且不使用快取。

前面幾節中提到的所有優化概念對於在ci管道中實施都是有效的。特別是快取。如果dockerfile發生了變化,那麼利用快取仍然是減少構建時間的最佳方法。作為ci管道的一部分,這是如何工作的?當使用docker執行器作為構建作業的執行時,可以利用稱為docker層快取(dlc)的功能來加快構建速度。

當構建docker映象是ci流程的常規部分時,dlc是一項很不錯的功能。dlc將儲存在作業中建立的映象層。dlc會快取在工作期間構建的任何docker映象的各個層,然後在後續的circleci執行中重用未更改的映象層,而不是每次都重新構建整個映象。

dockerfile提交的次數越少,映象構建步驟將執行得越快。dlc可以與機器執行程式和遠端docker環境(setup_remote_docker)一起使用。重要的是要注意,dlc僅在使用docker build,docker compose或類似的docker命令建立自己的docker映象時有用,它不會減少所有構建啟動初始環境所花費的時間。

docker下redis容器清理快取

1 登入至指定埠的redis服務 redis cli h 127.0.0.1 p 6379 其中,127.0.0.1可以寫成伺服器的ip位址,6379為埠號。注意 如果redis設定的有密碼要用 redis cli h 127.0.0.1 p 6379 a redis 不然執行下一步 keys 會報...

docker學習 docker容器

1.容器檢視 已經啟動的容器 docker ps 所有的容器 docker ps a2.啟動容器相關引數 互動式容器 退出時容器處於停止狀態,無法使用 docker run it name mynginx nginx bin bash 退出當前容器 exit 守護式容器 埠88是宿主機的對映埠 do...

docker初識 Docker 初識

一 docker 簡介 docker是乙個開源的應用容器,使用者可以將web程式和服務打包到乙個輕量級 可以移植的容器中,然後發布到任務流行的linux伺服器上,實現虛擬化。同時完全是沙箱操作,即docker內部是乙個沙箱操作,專案之間不會有任何介面,並且開銷極低。二 docker centos 安...