現代化小白也要嘗試的容器手札 - Docker 架構流程說明
Day 6. Docker 架構流程說明
簡易版
Client端
管理者如果想要透過容器執行一個簡單的NGINX網站服務可以有以下三種方式來實作:
- 從無到有自己撰寫NGINX的dockfile再透過docker build建立成Images,再透過docker pull取下至個人電腦空間後docker run就封裝成容器來呈現服務。
- 知道docker hub 或其他私有倉庫Registry中有NGINX映像檔透過docker pull取下至個人電腦空間後docker run就封裝成容器來呈現服務。
- 原來電腦空間就有此NGINX映像檔直接docker run就封裝成容器來呈現服務。
Host(Server)端
上述一系列需求動作都是透過docker daemon來做動作調用監視包含下圖中執行Docker Images並啟動容器或停止刪除容器等做有動作的執行與結果呈現反饋給用戶。
倉庫後端
這只需要足夠的空間並回應上傳下載的資源映像需求並把一個個所定義編排的映像檔放置好等著做提取進出的動作。
自虐版
- 用戶端透過Docker Client和Docker Daemon建立通訊發送請求給後端。
- Docker Daemon 提供伺服器服務功能接收來至Docker Client的請求,而Docker Engine 引擎驅動執行Docker內部一系列的工作,每項工作都各自獨立以Job 型態作呈現。
- Job執行階段如需要容器映像時,則從Registry倉庫中下載,並透過Graphdriver把下載的映像檔轉成 Graph 型態儲存。
- 當Docker需要建立網路時,則是通過Networkdriver佈建分派容器網路環境;而限制執行容器資源或用戶端命令等發送動作時,則透過Execdriver來完成。
- Libcontainer屬容器管理指揮官,networkdriver以及execdriver都是通過libcontainer來實現對容器進行的任何操作動作。當執行完容器命令後Docker容器會返回執行狀態,此容器擁有安全獨立的執行環境等..
分別針對上述的自虐架構行為各元件服務更深入探討>>
下圖服務模組Client,daemon,Engine與Jobf四個區塊說明
用戶端透過Docker Client和docker daemon建立通訊的溝通工具,可執行檔案為Dockerfile,透過docker命令對各種容器發起執行需求。
docker daemon是容器架構中常駐後台的系統程序,用來接收處理docker client傳送請求。當daemon在後台啟動一個server來接收docker client的傳送請求;Server可透過路由與分派排程任務找到相應handler來執行請求。
Engine是容器架構中的執行引擎,很重要的核心模組。主要是控制執行這一個個job任務來達到管理容器的目的。
Job是Docker Engine內最小工作執行單位。每項可執行的工作任務,都視同一個job,如:建立一個新容器實屬一個job,從網路下載一個映像檔也是一個job,建立Server對外HTTP也是一個job等等..
下圖服務模組Registry與Graph兩個區塊說明
Docker Registry任務就是容器映像的倉庫空間。當映像檔在容器被建立時載入用來初始化容器的檔案結構目錄。Docker執行過程中Daemon會與Registry通訊,實踐搜尋,上下傳映像這三項重要核心功能,附帶一提對應job命名分別是”search”,”pull” 與 “push”。
Graph這服務主要是下載間關係與下載完成後的容器映像保管與記錄。另外Graph也儲存本地具版本資訊的檔案系統映像,透過GraphDB記錄著所有檔案系統映像之間的關係。其具體儲存資訊包含:該容器映像中介資料,映像大小及該容器映像所代表的rootfs。
下圖服務模組Graphdriver,NetworkdriverExecdriver各區塊說明
Driver是Docker中驅動模組程式。可實現Docker容器執行環境自定義。因為Docker生命週期裡並非所有操作都是針對容器管理,還包含其他雜事包含Docker資訊獲取,Graph儲存與記錄等。
所以為了讓容器管理從Docker Daemon邏輯工作拆分,故設計出Driver層級的獨立服務來接管這類雜事的請求。
而就是因為很雜,所以又分出三組分別為:Graphdriver、networkdriver和execdriver。
Graphdriver上述也說明到主要就是用於完成容器映像儲存與獲取。而細部包含四種檔案系統在其內部註冊分別為aufs、btrfs、vfs與devmapper。
Networkdriver很明顯名詞已經猜得出來就是為了容器網路環境配置,包含如:Docker啟動時為容器環境建立專用虛擬網卡並綁定網路Bridge;為容器分配 IP位址、網路連接埠並與宿主伺服器網路做Ports映射以及防火牆等安全Policy等..
Execdriver則負責建立容器執行名稱空間,任務包含使用統計與限制,容器內部程序執行等..原來從前是透過LXC來操控容器配置及生命週期,而現在execdriver原生改使用native驅動,故已經不在依賴LXC。
下圖服務模組libcontainer區塊說明
libcontainer設計的初衷就是直接存取容器核心相關API服務。透過所提供的標準介面來滿足Docker上層對容器直接的管理要求。其中控制元件如:Namespace、cgroups、apparmor、網路連接等....
呈現最終的結果Docker container重點如下
- 用戶透過指定容器映像讓Docker容器可自定義rootfs文檔系統(容器專屬檔案格式)。
- 用戶透過資源配額讓Docker容器可以有限度的使用運算資源。
- 用戶透過網路配置與安全政策讓Docker容器的執行環境更安全。
- 用戶透過指令讓Docker容器去執行指定的工作任務。
留言
張貼留言