- Docker源碼分析
- 孫宏亮
- 957字
- 2018-12-31 20:27:01
1.4.2 docker run
docker run命令的作用是創(chuàng)建一個全新的Docker容器,并在容器內(nèi)部運(yùn)行指定命令。Docker Daemon處理用戶發(fā)起的這條命令時,所做工作可以分為兩部分:第一,創(chuàng)建Docker容器對象,并為容器準(zhǔn)備所需的rootfs;第二,創(chuàng)建容器的運(yùn)行環(huán)境,如網(wǎng)絡(luò)環(huán)境、資源限制等,最終真正運(yùn)行用戶指令。因此,在dockerrun命令的完整執(zhí)行流程中,Docker Client給Docker Server發(fā)送了兩次HTTP請求,第二次請求的發(fā)起取決于第一次請求的返回狀態(tài)。docker run命令執(zhí)行流程如圖1-11所示。

圖1-11 docker run命令執(zhí)行流程示意圖
圖1-11中有編號的箭頭表示dockerrun命令在發(fā)起后,Docker架構(gòu)中相應(yīng)模塊所做的一系列運(yùn)行。下面我們逐一分析這些步驟:
1)Docker Client處理用戶發(fā)起的docker run命令,解析完請求與參數(shù)之后,向Docker Server發(fā)送一個HTTP請求,HTTP請求方法為POST,請求URL為"/containers/create?"+"xxx",實(shí)際意義為創(chuàng)建一個容器對象,即Docker Daemon程序邏輯中的容器對象,并非實(shí)際運(yùn)行的容器。
2)Docker Server接收以上HTTP請求,并交給mux.Router,mux.Router通過URL以及請求方法來確定執(zhí)行該請求的具體handler。
3)mux.Router將請求路由分發(fā)至相應(yīng)的handler,具體為PostContainersCreate。
4)在PostContainersCreate這個handler之中,創(chuàng)建并初始化一個名為"create"的Job,之后觸發(fā)執(zhí)行該Job。
5)名為"create"的Job在運(yùn)行過程中執(zhí)行Container.Create操作,該操作需要獲取容器鏡像來為Docker容器準(zhǔn)備rootfs,通過graphdriver完成。
6)graphdriver從Graph中獲取創(chuàng)建Docker容器rootfs所需要的所有鏡像。
7)graphdriver將rootfs的所有鏡像通過某種聯(lián)合文件系統(tǒng)的方式加載至Docker容器指定的文件目錄下。
8)若以上操作全部正常執(zhí)行,沒有返回錯誤或異常,則Docker Client收到Docker Server返回狀態(tài)之后,發(fā)起第二次HTTP請求。請求方法為"POST",請求URL為"/containers/"+container_ID+"/start",實(shí)際意義為啟動時才創(chuàng)建完畢的容器對象,實(shí)現(xiàn)物理容器的真正運(yùn)行。
9)Docker Server接收以上HTTP請求,并交給mux.Router,mux.Router通過URL以及請求方法來確定執(zhí)行該請求的具體handler。
10)mux.Router將請求路由分發(fā)至相應(yīng)的handler,具體為PostContainersStart。
11)在PostContainersStart這個handler之中,創(chuàng)建并初始化名為"start"的Job,之后觸發(fā)執(zhí)行該Job。
12)名為"start"的Job執(zhí)行需要完成一系列與Docker容器相關(guān)的配置工作,其中之一是為Docker容器網(wǎng)絡(luò)環(huán)境分配網(wǎng)絡(luò)資源,如IP資源等,通過調(diào)用networkdriver完成。
13)networkdriver為指定的Docker容器分配網(wǎng)絡(luò)資源,其中有IP、port等,另外為容器設(shè)置防火墻規(guī)則。
14)返回名為"start"的Job,執(zhí)行完一些輔助性操作后,Job開始執(zhí)行用戶指令,調(diào)用execdriver。
15)execdriver被調(diào)用,開始初始化Docker容器內(nèi)部的運(yùn)行環(huán)境,如命名空間、資源控制與隔離,以及用戶命令的執(zhí)行,相應(yīng)的操作轉(zhuǎn)交至libcontainer來完成。
16)libcontainer被調(diào)用,完成Docker容器內(nèi)部的運(yùn)行環(huán)境初始化,并最終執(zhí)行用戶要求啟動的命令。
- 企業(yè)性能測試:體系構(gòu)建、落地指導(dǎo)與案例解讀
- 從零基礎(chǔ)到精通Flutter開發(fā)
- App草圖+流程圖+交互原型設(shè)計(jì)教程
- 知行合一: 實(shí)現(xiàn)價值驅(qū)動的敏捷和精益開發(fā)
- DevOps:企業(yè)級CI/CD實(shí)戰(zhàn)
- 產(chǎn)品經(jīng)理入門攻略
- 敏捷軟件開發(fā):用戶故事實(shí)戰(zhàn)
- 開發(fā)者關(guān)系:方法與實(shí)踐
- 微服務(wù)架構(gòu)原理與開發(fā)實(shí)戰(zhàn)
- Android5.0新特性實(shí)戰(zhàn)
- 混沌工程:通過可控故障實(shí)驗(yàn)提升軟件系統(tǒng)可靠性
- 獵豹行動:硝煙中的敏捷轉(zhuǎn)型之旅
- x86匯編與逆向工程:軟件破解與防護(hù)的藝術(shù)
- OpenGL ES 2.0游戲開發(fā)(上卷)
- 云原生應(yīng)用開發(fā)實(shí)戰(zhàn):基于.NET開發(fā)框架及Kubernetes容器編排技術(shù)