- Docker源碼分析
- 孫宏亮
- 1260字
- 2018-12-31 20:26:59
1.3.2 Docker Daemon
Docker Daemon是Docker架構(gòu)中一個(gè)常駐在后臺(tái)的系統(tǒng)進(jìn)程。所謂的“運(yùn)行Docker”,即代表運(yùn)行Docker Daemon??傊珼ockerDaemon的作用主要有以下兩方面:
□ 接收并處理Docker Client發(fā)送的請(qǐng)求。
□ 管理所有的Docker容器。
Docker Daemon運(yùn)行時(shí),會(huì)在后臺(tái)啟動(dòng)一個(gè)Server,Server負(fù)責(zé)接收Docker Client發(fā)送的請(qǐng)求;接收請(qǐng)求后,Server通過路由與分發(fā)調(diào)度,找到相應(yīng)的Handler來處理請(qǐng)求。
啟動(dòng)Docker Daemon所使用的可執(zhí)行文件同樣是docker,與Docker Client啟動(dòng)所使用的可執(zhí)行文件docker相同。既然Docker Client與Docker Daemon都可以通過docker二進(jìn)制文件創(chuàng)建,那么如何辨別兩者就變得非常重要。實(shí)際上,執(zhí)行docker命令時(shí),通過傳入的參數(shù)可以辨別Docker Daemon與Docker Client,如docker–d代表Docker Daemon的啟動(dòng),dockerps則代表創(chuàng)建Docker Client,并發(fā)送ps請(qǐng)求。
Docker Daemon的架構(gòu)大致可以分為三部分:Docker Server、Engine和Job。Daemon的架構(gòu)如圖1-2所示。
1.Docker Server
Docker Server在Docker架構(gòu)中專門服務(wù)于Docker Client,它的功能是接收并調(diào)度分發(fā)Docker Client發(fā)送的請(qǐng)求。Docker Server的架構(gòu)如圖1-3所示。

圖1-2 Docker Daemon架構(gòu)示意圖

圖1-3 Docker Server架構(gòu)示意圖
在Docker Daemon的啟動(dòng)過程中,DockerServer第一個(gè)完成。Docker Server通過包gorilla/mux,創(chuàng)建了一個(gè)mux.Router路由器,提供請(qǐng)求的路由功能。在Go語言中,gorilla/mux是一個(gè)強(qiáng)大的URL路由器以及調(diào)度分發(fā)器。創(chuàng)建路由器之后,Docker Server為mux.Router中添加有效的路由項(xiàng),每一個(gè)路由項(xiàng)由HTTP請(qǐng)求方法(PUT、POST、GET或DELETE)、URL和Handler三部分組成。
由于Docker Client通過HTTP協(xié)議訪問Docker Daemon,故DockerServer創(chuàng)建完mux.Router之后,將Server的監(jiān)聽地址以及mux.Router作為參數(shù),創(chuàng)建一個(gè)httpSrv=http.Server{},最終執(zhí)行httpSrv.Serve()開始服務(wù)于外部請(qǐng)求。
在服務(wù)過程中,Docker Server在listener上接收Docker Client的訪問請(qǐng)求。對(duì)于每一個(gè)Docker Client請(qǐng)求,DockerServer均會(huì)創(chuàng)建一個(gè)全新的goroutine來服務(wù)。在goroutine中,Docker Server首先讀取請(qǐng)求內(nèi)容,然后做請(qǐng)求解析工作,接著匹配相應(yīng)的路由項(xiàng),隨后調(diào)用相應(yīng)的Handler來處理,最后Handler處理完請(qǐng)求之后給Docker Client回復(fù)響應(yīng)。
需要注意的是:Docker Server在Docker的啟動(dòng)過程中運(yùn)行,通過一個(gè)名為“serveapi”的Job來實(shí)現(xiàn)。理論上,Docker Server的運(yùn)行只是眾多Job中的一個(gè),但是為了強(qiáng)調(diào)Docker Server的重要性以及它為后續(xù)Job服務(wù)的重要特性,本書將“serveapi”的Job單獨(dú)抽離出來分析,理解為Docker Server。
2.Engine
Engine是Docker架構(gòu)中的運(yùn)行引擎,同時(shí)也是Docker運(yùn)行的核心模塊。Engine存儲(chǔ)著大量的容器信息,同時(shí)管理著Docker大部分Job的執(zhí)行。換言之,Docker中大部分任務(wù)的執(zhí)行都需要Engine協(xié)助,并通過Engine匹配相應(yīng)的Job完成Job的執(zhí)行。
在Docker源碼中,有關(guān)Engine的數(shù)據(jù)結(jié)構(gòu)定義中含有一個(gè)名為handlers的對(duì)象。該handlers對(duì)象存儲(chǔ)的是關(guān)于眾多特定Job各自的處理方式handler。舉例說明,Engine的handlers對(duì)象中有一項(xiàng)為:{"create":daemon.ContainerCreate,},則說明當(dāng)執(zhí)行名為“create”的Job時(shí),執(zhí)行的是daemon.ContainerCreate這個(gè)handler。
除了容器管理之外,Engine還接管Docker Daemon的某些特定任務(wù)。當(dāng)Docker Daemon遭遇到自身進(jìn)程需要退出的情況時(shí),Engine還負(fù)責(zé)完成DockerDaemon退出前的所有善后工作。
3.Job
Job可以認(rèn)為是Docker架構(gòu)中Engine內(nèi)部最基本的工作執(zhí)行單元。DockerDaemon可以完成的每一項(xiàng)工作都會(huì)呈現(xiàn)為一個(gè)Job。例如,在Docker容器內(nèi)部運(yùn)行一個(gè)進(jìn)程,這是一個(gè)Job;創(chuàng)建一個(gè)新的容器,這是一個(gè)Job;在網(wǎng)絡(luò)上下載一個(gè)文檔,這是一個(gè)Job;包括之前在Docker Server部分談及的,創(chuàng)建Server服務(wù)于HTTP協(xié)議的API,這也是一個(gè)Job,等等。
有關(guān)Job接口的設(shè)計(jì),與UNIX進(jìn)程非常相仿。比如說,Job有一個(gè)名稱,有運(yùn)行時(shí)參數(shù),有環(huán)境變量,有標(biāo)準(zhǔn)輸入與標(biāo)準(zhǔn)輸出,有標(biāo)準(zhǔn)錯(cuò)誤,還有返回狀態(tài)等。
對(duì)于Job而言,定義完畢之后,運(yùn)行才能完成Job自身真正的使命。Job的運(yùn)行函數(shù)Run()則用以執(zhí)行Job本身。
- MATLAB與C/C++混合編程
- App草圖+流程圖+交互原型設(shè)計(jì)教程
- 網(wǎng)絡(luò)空間測(cè)繪技術(shù)與實(shí)踐:讓互聯(lián)網(wǎng)情報(bào)服務(wù)于網(wǎng)絡(luò)安全
- UML基礎(chǔ)與Rose建模案例(第3版)
- 用戶體驗(yàn)四維度
- 軟件開發(fā)生產(chǎn)率改進(jìn):軟件管理的有效領(lǐng)導(dǎo)力與量化方法
- 搜索引擎與程序化廣告:原理、設(shè)計(jì)與實(shí)戰(zhàn)
- 軟件架構(gòu)的藝術(shù)
- 負(fù)載均衡:高并發(fā)網(wǎng)關(guān)設(shè)計(jì)原理與實(shí)踐
- Visual Basic編程寶典(十年典藏版)
- 鳳凰項(xiàng)目:一個(gè)IT運(yùn)維的傳奇故事
- 虛擬現(xiàn)實(shí):科技新浪潮
- 云原生網(wǎng)關(guān)Traefik:入門、進(jìn)階與實(shí)戰(zhàn)
- 分布式應(yīng)用系統(tǒng)架構(gòu)設(shè)計(jì)與實(shí)踐
- React Cookbook中文版:87個(gè)案例帶你精通React框架