官术网_书友最值得收藏!

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本身。

主站蜘蛛池模板: 阳原县| 新巴尔虎左旗| 淮阳县| 青州市| 怀集县| 项城市| 崇义县| 卢湾区| 禹城市| 沈丘县| 鄂托克前旗| 济宁市| 渝北区| 陕西省| 永德县| 织金县| 新郑市| 伊春市| 海晏县| 阜南县| 游戏| 南宁市| 禹州市| 成武县| 肃南| 苏州市| 革吉县| 怀安县| 内乡县| 喀喇沁旗| 文成县| 襄垣县| 册亨县| 曲周县| 双江| 马关县| 冷水江市| 原平市| 陆良县| 澜沧| 南靖县|