《容器技术系列》一1.4 Docker运行案例分析
本節(jié)書摘來華章計(jì)算機(jī)《容器技術(shù)系列》一書中的第1章 ,第1.4節(jié),孫宏亮 著, 更多章節(jié)內(nèi)容可以訪問云棲社區(qū)“華章計(jì)算機(jī)”公眾號(hào)查看。
1.4 Docker運(yùn)行案例分析
1.3節(jié)著重介紹了Docker架構(gòu)中各個(gè)模塊的功能,學(xué)完后我們可以對(duì)Docker的架構(gòu)有一個(gè)宏觀的認(rèn)識(shí)。熟悉一款軟件,研究一個(gè)系統(tǒng),從靜態(tài)的角度認(rèn)識(shí)架構(gòu)的各個(gè)模塊,僅僅是第一步;從動(dòng)態(tài)的角度,掌握軟件或者系統(tǒng)的運(yùn)行原理,即熟知架構(gòu)中模塊間的通信邏輯,無疑會(huì)讓自己對(duì)軟件或系統(tǒng)的理解更上一層樓。本節(jié)將從實(shí)際的Docker運(yùn)行案例出發(fā),串聯(lián)Docker各模塊,從而學(xué)習(xí)Docker的運(yùn)行流程。分析原型為Docker中的docker pull與docker run兩個(gè)命令。
1.4.1 docker pull
1.3節(jié)中我們提到,用戶可以為容器指定鏡像,作為容器運(yùn)行時(shí)的rootfs,既然如此,鏡像從何而來則成為一個(gè)關(guān)鍵。答案很簡(jiǎn)單,一切都?xì)w功于docker pull命令。
docker pull命令的作用是:Docker Daemon從Docker Registry下載指定的容器鏡像,并將鏡像存儲(chǔ)在本地的Graph中,以備后續(xù)創(chuàng)建Docker容器時(shí)使用。docker pull命令的執(zhí)行流程如圖1-10所示。
圖1-10中有編號(hào)的箭頭表示docker pull命令在發(fā)起后,Docker架構(gòu)中相應(yīng)模塊所做的一系列運(yùn)行操作。下面我們逐一分析這些步驟。
1)Docker Client處理用戶發(fā)起的docker pull命令,解析完請(qǐng)求以及參數(shù)之后,發(fā)送一個(gè)HTTP請(qǐng)求給Docker Server,HTTP請(qǐng)求方法為POST,請(qǐng)求URL為"/images/create?"+"xxx",實(shí)際意義為下載相應(yīng)的鏡像。
2)Docker Server接收以上HTTP請(qǐng)求,并交給mux.Router,mux.Router通過URL以及請(qǐng)求方法類型來確定執(zhí)行該請(qǐng)求的具體handler。
3)mux.Router將請(qǐng)求路由分發(fā)至相應(yīng)的handler,具體為PostImagesCreate。
4)在PostImageCreate這個(gè)handler之中,創(chuàng)建并初始化一個(gè)名為"pull"的Job,之后觸發(fā)執(zhí)行該Job。
5)名為"pull"的Job在執(zhí)行過程中執(zhí)行pullRepository操作,即從Docker Registry中下載相應(yīng)的一個(gè)或者多個(gè)Docker鏡像。
6)名為"pull"的Job將下載的Docker鏡像交給graphdriver管理。
7)graphdriver負(fù)責(zé)存儲(chǔ)Docker鏡像,一方面將實(shí)際鏡像存儲(chǔ)至本地文件系統(tǒng)中,另一方面為鏡像創(chuàng)建對(duì)象,由Docker Daemon統(tǒng)一管理。
1.4.2 docker run
docker run命令的作用是創(chuàng)建一個(gè)全新的Docker容器,并在容器內(nèi)部運(yùn)行指定命令。Docker Daemon處理用戶發(fā)起的這條命令時(shí),所做工作可以分為兩部分:第一,創(chuàng)建Docker容器對(duì)象,并為容器準(zhǔn)備所需的rootfs;第二,創(chuàng)建容器的運(yùn)行環(huán)境,如網(wǎng)絡(luò)環(huán)境、資源限制等,最終真正運(yùn)行用戶指令。因此,在dockerrun命令的完整執(zhí)行流程中,Docker Client給Docker Server發(fā)送了兩次HTTP請(qǐng)求,第二次請(qǐng)求的發(fā)起取決于第一次請(qǐng)求的返回狀態(tài)。docker run命令執(zhí)行流程如圖1-11所示。
圖1-11中有編號(hào)的箭頭表示dockerrun命令在發(fā)起后,Docker架構(gòu)中相應(yīng)模塊所做的一系列運(yùn)行。下面我們逐一分析這些步驟:
1)Docker Client處理用戶發(fā)起的docker run命令,解析完請(qǐng)求與參數(shù)之后,向Docker Server發(fā)送一個(gè)HTTP請(qǐng)求,HTTP請(qǐng)求方法為POST,請(qǐng)求URL為"/containers/create?"+"xxx",實(shí)際意義為創(chuàng)建一個(gè)容器對(duì)象,即Docker Daemon程序邏輯中的容器對(duì)象,并非實(shí)際運(yùn)行的容器。
2)Docker Server接收以上HTTP請(qǐng)求,并交給mux.Router,mux.Router通過URL以及請(qǐng)求方法來確定執(zhí)行該請(qǐng)求的具體handler。
3)mux.Router將請(qǐng)求路由分發(fā)至相應(yīng)的handler,具體為PostContainersCreate。
4)在PostContainersCreate這個(gè)handler之中,創(chuàng)建并初始化一個(gè)名為"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í)行,沒有返回錯(cuò)誤或異常,則Docker Client收到Docker Server返回狀態(tài)之后,發(fā)起第二次HTTP請(qǐng)求。請(qǐng)求方法為"POST",請(qǐng)求URL為"/containers/"+container_ID+"/start",實(shí)際意義為啟動(dòng)時(shí)才創(chuàng)建完畢的容器對(duì)象,實(shí)現(xiàn)物理容器的真正運(yùn)行。
9)Docker Server接收以上HTTP請(qǐng)求,并交給mux.Router,mux.Router通過URL以及請(qǐng)求方法來確定執(zhí)行該請(qǐng)求的具體handler。
10)mux.Router將請(qǐng)求路由分發(fā)至相應(yīng)的handler,具體為PostContainersStart。
11)在PostContainersStart這個(gè)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í)行用戶要求啟動(dòng)的命令。
總結(jié)
以上是生活随笔為你收集整理的《容器技术系列》一1.4 Docker运行案例分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: anguler 画面布局适应屏幕大小_前
- 下一篇: 微软Hololens学院教程- Holo