1制轰、Docker Server 簡介
Docker 架構(gòu)中前计,Docker Server 是 Docker Daemon 的重要組成部分。Docker Server 最主要的功能是:
- 接受用戶動(dòng)過Docker Client 發(fā)送的請(qǐng)求垃杖,并按照相應(yīng)的路由規(guī)則實(shí)現(xiàn)路由分發(fā)男杈。
- Docker Server 具備十分優(yōu)秀的用戶友好性,多種通信協(xié)議的支持大大降低 Docker 用戶使用 Docker 的門檻缩滨。除此之外势就,Docker Server 設(shè)計(jì)實(shí)現(xiàn)了詳盡清晰的 API 接口,以供 Docker 用戶選擇使用脉漏。通信安全方面苞冯,Docker Server 可以提供安全傳輸層協(xié)議(TLS),保證數(shù)據(jù)的加密傳輸侧巨。并發(fā)處理方面舅锄,Docker Daemon 大量使用了 Golang 中的 goroutine,大大提高了服務(wù)端的并發(fā)處理能力司忱。
2皇忿、Docker Server 創(chuàng)建流程
Docker Daemon 最后環(huán)節(jié)創(chuàng)建的并運(yùn)行的serveapi的job 就是讓守護(hù)進(jìn)程提供API訪問服務(wù)
2.1 創(chuàng)建一個(gè) job 名為serveapi并配置Docker server 監(jiān)控的協(xié)議與監(jiān)聽地址
2.2 Docker Daemon為 job 配置環(huán)境參數(shù)
- 用指定參數(shù)直接初始化 job 的Args 屬性
- 創(chuàng)建完Job后,給Job添加指定的環(huán)境變量
環(huán)境變量總結(jié):
1坦仍、環(huán)境變量名
2鳍烁、flag 參數(shù)
3、默認(rèn)值
4繁扎、作用值
job.SetenvBool("Logging", true) #使用日志輸出
job.SetenvBool("EnableCors", *flEnableCors) #在遠(yuǎn)程 API 中提供 CORS 頭
job.Setenv("Version", dockerversion.VERSION) #顯示 Docker 版本號(hào)
job.Setenv("SocketGroup", *flSocketGroup) #在 daemon 模式中 unix domain socket 分配用戶組名
job.SetenvBool("Tls", *flTls) #使用 TLS 安全傳輸協(xié)議
job.SetenvBool("TlsVerify", *flTlsVerify) #使用 TLS 并驗(yàn)證遠(yuǎn)程 Client
job.Setenv("TlsCa", *flCa) #指定 CA 文件路徑
job.Setenv("TlsCert", *flCert) #LS 證書文件路徑
job.Setenv("TlsKey", *flKey) #TLS 密鑰文件路徑
job.SetenvBool("BufferRequests", true) #緩存 Docker Client 請(qǐng)求
2.3 運(yùn)行Job
3幔荒、ServeApi 運(yùn)行流程
- 判斷Docker Server 有沒有監(jiān)聽的協(xié)議與地址
- 定義兩個(gè)變量
1)定義了protaAddrs=job.Args
2)定義 activationLock 通道 保證acceptconnections 這個(gè)Job 的運(yùn)行能夠起到通知serveapi 開啟正式服務(wù)于API的效果 - 遍歷 protaAddrs 即 job.Args 將其中的每一項(xiàng)都按照字符串“://”進(jìn)行分割糊闽,分割后判斷是否分割成2項(xiàng),最后分別創(chuàng)建一個(gè) goroutine 來執(zhí)行 ListenAndServe 的操作爹梁。其中最為重要的是 ListenAndServe 的實(shí)現(xiàn)右犹,該函數(shù)具體實(shí)現(xiàn)了如何創(chuàng)建 listener、router 以及 server姚垃,并協(xié)調(diào)三者進(jìn)行工作念链,最終服務(wù)于 API 請(qǐng)求
- 根據(jù) chErrors 的值運(yùn)行,若 chErrors 這個(gè) channel 中有錯(cuò)誤內(nèi)容积糯,則 ServeApi 該函數(shù)返回掂墓;若無錯(cuò)誤內(nèi)容,則循環(huán)被阻塞看成。
4梆暮、ListenAndServe 實(shí)現(xiàn)
ListenAndServe 的功能是:
使 Docker Server 監(jiān)聽某一指定地址,接受該地址上的請(qǐng)求绍昂,并對(duì)以上請(qǐng)求路由轉(zhuǎn)發(fā)至相應(yīng)的處理函數(shù) Handler 處啦粹。從實(shí)現(xiàn)的角度來看,ListenAndServe 主要實(shí)現(xiàn)了設(shè)置一個(gè)服務(wù)于 HTTP 的 server窘游,該 server 將監(jiān)聽指定地址上的請(qǐng)求唠椭,并對(duì)請(qǐng)求做特定的協(xié)議檢查,最終完成請(qǐng)求的路由與分發(fā)忍饰。
ListenAndServe 的實(shí)現(xiàn)可以分為以下 4 個(gè)部分:
- 創(chuàng)建 router 路由實(shí)例贪嫂;
- 創(chuàng)建 listener 監(jiān)聽實(shí)例;
- 創(chuàng)建 http.Server艾蓝;
- 啟動(dòng) API 服務(wù)力崇。
4.1、創(chuàng)建 router 路由實(shí)例
路由實(shí)例的作用是:負(fù)責(zé)Docker Server 對(duì)請(qǐng)求進(jìn)行路由以及分發(fā)赢织。實(shí)現(xiàn)過程中亮靴,主要兩個(gè)步驟:
第一,創(chuàng)建全新的router 路由實(shí)例于置;
第二茧吊,為router 實(shí)例添加路由記錄。
#mux.Router 會(huì)通過一系列已經(jīng)注冊(cè)過的路由記錄八毯,來為接受的請(qǐng)求做匹配
1) 請(qǐng)求可以基于 URL 的主機(jī)名搓侄、路徑、路徑前綴话速、shemes讶踪、請(qǐng)求頭和請(qǐng)求值、HTTP 請(qǐng)求方法類型或者使用自定義的匹配規(guī)則泊交;
2) URL 主機(jī)名和路徑可以擁有一個(gè)正則表達(dá)式來表示乳讥;
3) 注冊(cè)的 URL 可以被直接運(yùn)用筹麸,也可以被保留,這樣可以保證維護(hù)資源的使用雏婶;
4) 路由記錄可以被用以子路由器:如果父路由記錄匹配,則嵌套記錄只會(huì)被用來測(cè)試白指。當(dāng)設(shè)計(jì)一個(gè)組內(nèi)的路由記錄共享相同的匹配條件時(shí)留晚,如主機(jī)名、路勁前綴或者其他重復(fù)的屬性告嘲,子路由的方式很有幫助错维;
5) mux.Router 實(shí)現(xiàn)了 http.Handler 接口,故和標(biāo)準(zhǔn)的 http.ServeMux 兼容橄唬。
4.2赋焕、創(chuàng)建 listener 監(jiān)聽實(shí)例
Listener 是一種面向流協(xié)議的通用網(wǎng)絡(luò)監(jiān)聽模塊。
在創(chuàng)建 Listener 之前仰楚,先判斷 Docker Server 允許的協(xié)議隆判,若協(xié)議為 fd 形式,則直接通過 ServeFd 來服務(wù)請(qǐng)求僧界;若協(xié)議不為 fd 形式侨嘀,則繼續(xù)往下執(zhí)行。
4.3捂襟、創(chuàng)建 http.Server
Docker Server 同樣需要?jiǎng)?chuàng)建一個(gè) Server 對(duì)象來運(yùn)行 HTTP 服務(wù)端
4.4咬腕、啟動(dòng) API 服務(wù)
創(chuàng)建 http.Server 實(shí)例之后,Docker Server 立即啟動(dòng) API 服務(wù)葬荷,使 Docker Server 開始在 Listener 監(jiān)聽實(shí)例 l 上接受請(qǐng)求涨共,并對(duì)于每一個(gè)請(qǐng)求都生成一個(gè)新的 goroutine 來做專屬服務(wù)。對(duì)于每一個(gè)請(qǐng)求宠漩,goroutine 會(huì)讀取請(qǐng)求举反,查詢路由表中的路由記錄項(xiàng),找到匹配的路由記錄扒吁,最終調(diào)用路由記錄中的執(zhí)行 Handler照筑,執(zhí)行完畢后,goroutine 對(duì)請(qǐng)求返回響應(yīng)信息瘦陈。