DevOps 流程中對于 Docker Image 的分層管理與實踐

zhishui324 9年前發布 | 23K 次閱讀 Docker

概念介紹

Docker

Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然后發布到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口(類似 iPhone 的 app);幾乎沒有性能開銷,可以很容易地在機器和數據中心中運行。最重要的是,它們不依賴于任何語言、框架包括系統。

DevOps

DevOps(英文 Development 和 Operations 的組合)是一組過程、方法與系統的統稱,用于促進開發(應用程序/軟件工程)、技術運營和質量保障(QA)部門之間的溝通、協作與整合。它的出現是由于軟件行業日益清晰地認識到:為了按時交付軟件產品和服務,開發和運營工作必須緊密合作。越來越多的企業和項目將整體的代碼管理、構建、集成、發布流程通過 DevOps 自動整合在了一起。同時還融入自動化測試等其他技術,使得整個整個軟件產品的生命周期實現了可持續的運轉。

Docker Image 分層存儲

為了最大化重用 Image,加快運行速度,減少內存和磁盤的占用,Docker container 運行時所構造的運行環境,實際上是由具有依賴關系的多個 Layer 組成的。如圖 1 所示,每一串數字 ID 就代表了一個 Docker Image Layer。當我們在 pull 一個 Docker Image 的時候我們會發現所有依賴的 Layer 文件將會被 download。

圖 1. Docker Image 分層示意圖

例如一個 Docker App Image 的運行環境是在基礎的 Docker Base Image 的基礎上,疊加了包含例如 JDK 等各種工具的 Image,再疊加包含 Liberty 及其相關依賴 Liberty 的 Image,以及包含了 J2EE 應用的 EAR 包的 layer。這些 Image 由 AUFS 文件系統加載合并到統一路徑中,以只讀的方式存在,最后再疊加加載一層可寫的空白的 Layer 用作記錄對當前運行環境所作的修改。因此,當 Docker Image 每次由一個基礎 Image 創建后,新 Image 就自動增加了一層。如圖 2 所示

圖 2. Docker Image Layer 的疊加

Docker Image 在 DevOps 流程中的應用

盡管 Puppet、Chef、Salt 以及其它先行者已經在 DevOps 的探索中作出了相當的貢獻,但這些工具的主要活動舞臺仍然集中在運營團隊而非開發者群體當中。

由于 Docker 的可移植性和容器的封裝性。開發人員可以在容器機制內部工作,而運營工程師則能夠在容器外部以并行處理自己的任務,使其成為了一款能夠在開發人員群體中獲得與運營工程師同等認可效果的 DevOps 工具。

Docker 技術在 DevOps 過程中使用方式并沒有特別的規定,但大致可分為兩類

(1)將產品封裝到 Docker 容器中做成 immutable 的 Image 使用

(2)將 docker 容器作為固定并統一的運行環境。與構建出來的產品進行綁定使用。

兩種使用方式上并沒有本質的差別,完全根據實際情況進行選擇。本文下面的章節將主要以將產品封裝到 Docker 容器中做成 immutable image 的方式為背景進行介紹。基于 Docker 的 DevOps 流程如圖 3 所示:

圖 3. 基于 Docker 的 DevOps 流程圖

隨著項目基于 Docker 的使用逐漸增加,Docker Image 的數量也將逐漸增加。隨之而來的問題就是如何維護這些 Docker Image 的升級。如果缺乏規劃和設計,每個 Docker Image 均來自一個最基礎的 OS Image,那么就需要對于所有的 Docker Image 進行重構。如圖 4 所示:

圖 4. Docker Image 衍生單一 Base Image

當環境進行更新升級的時候,如果所有的節點均來自一個基礎的 OS Image,重復的 layer 層將會被重復更新。也就意味著,這部分重復的內容會被反復的下載。如果一個 Docker Image 達到了 1G 以上的規模,而每個 Docker Host 節點的更新都需要重新下載新的 Image. 這樣環境更新所花費的時間將會是成倍的增加。如圖 5 所示,Docker Image 2 和 Docker Image3 均是基于 Docker Image 1

圖 5. 基于同樣 Base Image 的 Docker Image Layer 的疊加

圖 6. Docker Image Layer 在 Docker Host 上的存儲關系

從圖 6 可以看出在同一個 Docker host 上 download 來自同樣 Base Image 的 Docker Image, Docker 在下載 Image layer 的時候,對于已經存在的 layer 是不會重復下載的。但是如果 layer 不同,即使內部包含的內容一樣,也還是會重復下載的。

利用分層機制優化 Docker Image

通過上一節的介紹,可以看缺乏良好設計的 Docker Image 會給日后的維護以及 DevOps 的效率帶來較大的問題。本文接下來就將重點介紹如何利用分層機制對項目的 Docker Image 進行合理的規劃。從而大幅提升 Docker 在 DevOps 過程中的可持續性。并提升 DevOps 的效率。

設計基于分層機制的 Docker Image

以基于云平臺的分布式應用為例. 在分布式系統中我們假設有兩個應用 App1 和 App2。 這兩個節點所的環境信息如下:

表 1. 分布式應用環境配置需求對照表

通過表 1 環境信息的對比,我們發現在這兩個不同引用的節點上,不同的部分只是 logstash 的 config 文件和最后的 Ear 包。

對于其他相同的部分,我們可以考慮通過 Docker Image Layer 的概念將其復用。從而最大限度發揮 Docker 的能力。

 

將上表中的兩部分環境信息以分類為節點名,重新以樹狀結構組織如圖 7 所示。

 

圖 7. 分布式應用環境配置樹狀圖 1

然后以 Docker Image Layer 最多不超過 4 層的標準,將一些不會經常發生變化或者可以用于其他 Docker Image 的層合并。如圖 8 所示:

圖 8. 分布式應用環境配置樹狀圖 2

最后將圖中的兩個樹狀結構圖進行疊加將重復的節點進行合并,最后得出如下樹狀結構圖:

圖 9. 分布式應用環境配置樹狀圖 3

到目前為止我們已經基于 Docker Image 的分層存儲機制完成了一個基于云平臺分布式系統的 Docker Image 的規劃。接下來就可以根據上圖結構分別制作 Image。最終我們將會有三個 Base Image。如圖 10 所示,其中 Base OS Image,將作為項目中所有 Docker Image 的 base,JDK Image 可以在其基礎上繼續衍生出其他的 Image。 例如以該 Image 為基礎創建 Tomcat Image 等。Liberty Image 可以在其基礎上創建更多類型的應用 Image。

圖 10. 基于分層存儲的 Docker Image 樹的多版本衍生

如果其中的 Liberty Image 發生變化的時候,例如需要升級 Liberty 版本的時候,只需要重新更新該節點和該節點之后的其他 Image 節點,而不會影響到 Liberty Image 節點的兄弟節點或者父親節點以及由這些節點衍生出來的其他的 Docker Image。當更新 App Image 的時候,由于其均來自同樣的父親節點 Liberty Image。 所以每次更新的時候只會做 EAR 包的增量更新。

基于分層機制的 Docker Image 的實踐

如圖 11 所示, 按照之前介紹的安裝 JDK、Logstash、Liberty 的 Docker Image 大小在 1.8 G 左右。以此為基礎創建的的 App Image 的大小在 1.9G 左右。

圖 11. Docker Image 分層存儲實驗 1

在一個已經 download 了 Liberty Docker Image 的環境下下載 App Image。如圖 12 所示,可以看到已經存在的 layer 已經是 complete 狀態。 唯一 download 的部分只有新增加的 EAR 所產生的新的 layer。所需時間僅僅為 1 分 33 秒。

圖 12. Docker Image 分層存儲實驗 2

如果直接在一個不存在 Liberty Docker Image 的 server 上去 download App Docker Image, 如圖 13 所示,我們可以看到所需要的時間將超過 7 分鐘。

圖 13. Docker Image 分層存儲實驗 3

通過圖 14 可以發現其他 layer 的 download 時間要超過 4 分鐘,如果反復對這些重復的 Docker Image layer 進行下載更新,將會嚴重影響環境更新的效率。隨著不同 Image 之間在 Docker Image Layer 上的差異越大,所花費的下載 Docker Image 的代價也將越大。

圖 14. Docker Image 分層存儲實驗 4

小結

本文通過對 DevOps 和 Docker 基本概念的介紹以及 Docker Image 分層存儲的原理和實踐結果說明,希望帶給您一個思路,從而根據自身項目的實際情況規劃和設計自己的 Docker Image。從而將 Docker 技術和 DevOps 更好的結合起來,構建一個可持續的產品生產,測試,發布的生態環境。

 

來自: http://blog.csdn.net/enweitech/article/details/51782636

 

 本文由用戶 zhishui324 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!