《容器技術係列》一1.4 Docker運行案例分析
本節書摘來異步社區《容器技術係列》一書中的第1章 ,第1.4節,孫宏亮 著, 更多章節內容可以訪問雲棲社區“異步社區”公眾號查看。
1.4 Docker運行案例分析
1.3節著重介紹了Docker架構中各個模塊的功能,學完後我們可以對Docker的架構有一個宏觀的認識。熟悉一款軟件,研究一個係統,從靜態的角度認識架構的各個模塊,僅僅是第一步;從動態的角度,掌握軟件或者係統的運行原理,即熟知架構中模塊間的通信邏輯,無疑會讓自己對軟件或係統的理解更上一層樓。本節將從實際的Docker運行案例出發,串聯Docker各模塊,從而學習Docker的運行流程。分析原型為Docker中的docker pull與docker run兩個命令。
1.4.1 docker pull
1.3節中我們提到,用戶可以為容器指定鏡像,作為容器運行時的rootfs,既然如此,鏡像從何而來則成為一個關鍵。答案很簡單,一切都歸功於docker pull命令。
docker pull命令的作用是:Docker Daemon從Docker Registry下載指定的容器鏡像,並將鏡像存儲在本地的Graph中,以備後續創建Docker容器時使用。docker pull命令的執行流程如圖1-10所示。
圖1-10中有編號的箭頭表示docker pull命令在發起後,Docker架構中相應模塊所做的一係列運行操作。下麵我們逐一分析這些步驟。
1)Docker Client處理用戶發起的docker pull命令,解析完請求以及參數之後,發送一個HTTP請求給Docker Server,HTTP請求方法為POST,請求URL為"/images/create?"+"xxx",實際意義為下載相應的鏡像。
2)Docker Server接收以上HTTP請求,並交給mux.Router,mux.Router通過URL以及請求方法類型來確定執行該請求的具體handler。
3)mux.Router將請求路由分發至相應的handler,具體為PostImagesCreate。
4)在PostImageCreate這個handler之中,創建並初始化一個名為"pull"的Job,之後觸發執行該Job。
5)名為"pull"的Job在執行過程中執行pullRepository操作,即從Docker Registry中下載相應的一個或者多個Docker鏡像。
6)名為"pull"的Job將下載的Docker鏡像交給graphdriver管理。
7)graphdriver負責存儲Docker鏡像,一方麵將實際鏡像存儲至本地文件係統中,另一方麵為鏡像創建對象,由Docker Daemon統一管理。
1.4.2 docker run
docker run命令的作用是創建一個全新的Docker容器,並在容器內部運行指定命令。Docker Daemon處理用戶發起的這條命令時,所做工作可以分為兩部分:第一,創建Docker容器對象,並為容器準備所需的rootfs;第二,創建容器的運行環境,如網絡環境、資源限製等,最終真正運行用戶指令。因此,在dockerrun命令的完整執行流程中,Docker Client給Docker Server發送了兩次HTTP請求,第二次請求的發起取決於第一次請求的返回狀態。docker run命令執行流程如圖1-11所示。
圖1-11中有編號的箭頭表示dockerrun命令在發起後,Docker架構中相應模塊所做的一係列運行。下麵我們逐一分析這些步驟:
1)Docker Client處理用戶發起的docker run命令,解析完請求與參數之後,向Docker Server發送一個HTTP請求,HTTP請求方法為POST,請求URL為"/containers/create?"+"xxx",實際意義為創建一個容器對象,即Docker Daemon程序邏輯中的容器對象,並非實際運行的容器。
2)Docker Server接收以上HTTP請求,並交給mux.Router,mux.Router通過URL以及請求方法來確定執行該請求的具體handler。
3)mux.Router將請求路由分發至相應的handler,具體為PostContainersCreate。
4)在PostContainersCreate這個handler之中,創建並初始化一個名為"create"的Job,之後觸發執行該Job。
5)名為"create"的Job在運行過程中執行Container.Create操作,該操作需要獲取容器鏡像來為Docker容器準備rootfs,通過graphdriver完成。
6)graphdriver從Graph中獲取創建Docker容器rootfs所需要的所有鏡像。
7)graphdriver將rootfs的所有鏡像通過某種聯合文件係統的方式加載至Docker容器指定的文件目錄下。
8)若以上操作全部正常執行,沒有返回錯誤或異常,則Docker Client收到Docker Server返回狀態之後,發起第二次HTTP請求。請求方法為"POST",請求URL為"/containers/"+container_ID+"/start",實際意義為啟動時才創建完畢的容器對象,實現物理容器的真正運行。
9)Docker Server接收以上HTTP請求,並交給mux.Router,mux.Router通過URL以及請求方法來確定執行該請求的具體handler。
10)mux.Router將請求路由分發至相應的handler,具體為PostContainersStart。
11)在PostContainersStart這個handler之中,創建並初始化名為"start"的Job,之後觸發執行該Job。
12)名為"start"的Job執行需要完成一係列與Docker容器相關的配置工作,其中之一是為Docker容器網絡環境分配網絡資源,如IP資源等,通過調用networkdriver完成。
13)networkdriver為指定的Docker容器分配網絡資源,其中有IP、port等,另外為容器設置防火牆規則。
14)返回名為"start"的Job,執行完一些輔助性操作後,Job開始執行用戶指令,調用execdriver。
15)execdriver被調用,開始初始化Docker容器內部的運行環境,如命名空間、資源控製與隔離,以及用戶命令的執行,相應的操作轉交至libcontainer來完成。
16)libcontainer被調用,完成Docker容器內部的運行環境初始化,並最終執行用戶要求啟動的命令。
最後更新:2017-06-21 15:02:05