概念介紹
Docker
Docker 是1個開源的利用容器引擎,讓開發者可以打包他們的利用和依賴包到1個可移植的容器中,然后發布到任何流行的 Linux 機器上,也能夠實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口(類似 iPhone 的 app);幾近沒有性能開消,可以很容易地在機器和數據中心中運行。最重要的是,它們不依賴于任何語言、框架包括系統。
DevOps
DevOps(英文 Development 和 Operations 的組合)是1組進程、方法與系統的統稱,用于增進開發(利用程序/軟件工程)、技術運營和質量保障(QA)部門之間的溝通、協作與整合。它的出現是由于軟件行業日趨清晰地認識到:為了按時交付軟件產品和服務,開發和運營工作必須緊密合作。愈來愈多的企業和項目將整體的代碼管理、構建、集成、發布流程通過 DevOps 自動整合在了1起。同時還融入自動化測試等其他技術,使得全部全部軟件產品的生命周期實現了可延續的運轉。
Docker Image 分層存儲
為了最大化重用 Image,加快運行速度,減少內存和磁盤的占用,Docker container 運行時所構造的運行環境,實際上是由具有依賴關系的多個 Layer 組成的。如圖 1 所示,每串數字 ID 就代表了1個 Docker Image Layer。當我們在 pull 1個 Docker Image 的時候我們會發現所有依賴的 Layer 文件將會被 download。
圖 1. Docker Image 分層示意圖
例如1個 Docker App Image 的運行環境是在基礎的 Docker Base Image 的基礎上,疊加了包括例如 JDK 等各種工具的 Image,再疊加包括 Liberty 及其相干依賴 Liberty 的 Image,和包括了 J2EE 利用的 EAR 包的 layer。這些 Image 由 AUFS 文件系統加載合并到統1路徑中,以只讀的方式存在,最后再疊加加載1層可寫的空白的 Layer 用作記錄對當前運行環境所作的修改。因此,當 Docker Image 每次由1個基礎 Image 創建后,新 Image 就自動增加了1層。如圖 2 所示
圖 2. Docker Image Layer 的疊加
Docker Image 在 DevOps 流程中的利用
雖然 Puppet、Chef、Salt 和其它先行者已在 DevOps 的探索中作出了相當的貢獻,但這些工具的主要活動舞臺依然集中在運營團隊而非開發者群體當中。
由于 Docker 的可移植性和容器的封裝性。開發人員可以在容器機制內部工作,而運營工程師則能夠在容器外部以并行處理自己的任務,使其成了1款能夠在開發人員群體中取得與運營工程師同等認可效果的 DevOps 工具。
Docker 技術在 DevOps 進程中使用方式并沒有特別的規定,但大致可分為兩類
(1)將產品封裝到 Docker 容器中做成 immutable 的 Image 使用
(2)將 docker 容器作為固定并統1的運行環境。與構建出來的產品進行綁定使用。
兩種使用方式上并沒有本質的差別,完全根據實際情況進行選擇。本文下面的章節將主要以將產品封裝到 Docker 容器中做成 immutable image 的方式為背景進行介紹?;?Docker 的 DevOps 流程如圖 3 所示:
圖 3. 基于 Docker 的 DevOps 流程圖
隨著項目基于 Docker 的使用逐步增加,Docker Image 的數量也將逐步增加。隨之而來的問題就是如何保護這些 Docker Image 的升級。如果缺少計劃和設計,每一個 Docker Image 均來自1個最基礎的 OS Image,那末就需要對所有的 Docker Image 進行重構。如圖 4 所示:
圖 4. Docker Image 衍生單1 Base Image
當環境進行更新升級的時候,如果所有的節點均來自1個基礎的 OS Image,重復的 layer 層將會被重復更新。也就意味著,這部份重復的內容會被反復的下載。如果1個 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 可以看出在同1個 Docker host 上 download 來自一樣 Base Image 的 Docker Image, Docker 在下載 Image layer 的時候,對已存在的 layer 是不會重復下載的。但是如果 layer 不同,即便內部包括的內容1樣,也還是會重復下載的。
利用分層機制優化 Docker Image
通過上1節的介紹,可以看缺少良好設計的 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 層的標準,將1些不會常常產生變化或可以用于其他 Docker Image 的層合并。如圖 8 所示:
圖 8. 散布式利用環境配置樹狀圖 2
最后將圖中的兩個樹狀結構圖進行疊加將重復的節點進行合并,最后得出以下樹狀結構圖:
圖 9. 散布式利用環境配置樹狀圖 3
到目前為止我們已基于 Docker Image 的分層存儲機制完成了1個基于云平臺散布式系統的 Docker Image 的計劃。接下來就能夠根據上圖結構分別制作 Image。終究我們將會有3個 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
在1個已 download 了 Liberty Docker Image 的環境下下載 App Image。如圖 12 所示,可以看到已存在的 layer 已是 complete 狀態。 唯1 download 的部份只有新增加的 EAR 所產生的新的 layer。所需時間僅僅為 1 分 33 秒。
圖 12. Docker Image 分層存儲實驗 2
如果直接在1個不存在 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 分層存儲的原理和實踐結果說明,希望帶給您1個思路,從而根據本身項目的實際情況計劃和設計自己的 Docker Image。從而將 Docker 技術和 DevOps 更好的結合起來,構建1個可延續的產品生產,測試,發布的生態環境。