五、Docker Server 的創(chuàng)建(摘自《Docker源碼分析》)

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)信息瘦陈。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末凝危,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子晨逝,更是在濱河造成了極大的恐慌蛾默,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異揽浙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)崇渗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門牧挣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來急前,“玉大人,你說我怎么就攤上這事瀑构●烧耄” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵寺晌,是天一觀的道長世吨。 經(jīng)常有香客問我,道長呻征,這世上最難降的妖魔是什么耘婚? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮陆赋,結(jié)果婚禮上沐祷,老公的妹妹穿的比我還像新娘。我一直安慰自己攒岛,他們只是感情好戈轿,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著阵子,像睡著了一般思杯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上挠进,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天色乾,我揣著相機(jī)與錄音,去河邊找鬼领突。 笑死暖璧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的君旦。 我是一名探鬼主播澎办,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼金砍!你這毒婦竟也來了局蚀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤恕稠,失蹤者是張志新(化名)和其女友劉穎琅绅,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鹅巍,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡千扶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年料祠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片澎羞。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡髓绽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出妆绞,到底是詐尸還是另有隱情顺呕,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布摆碉,位于F島的核電站,受9級(jí)特大地震影響脓豪,放射性物質(zhì)發(fā)生泄漏巷帝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一扫夜、第九天 我趴在偏房一處隱蔽的房頂上張望楞泼。 院中可真熱鬧,春花似錦笤闯、人聲如沸堕阔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽超陆。三九已至,卻和暖如春浦马,著一層夾襖步出監(jiān)牢的瞬間时呀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來泰國打工晶默, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谨娜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓磺陡,卻偏偏與公主長得像趴梢,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子币他,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容