轉(zhuǎn)載:[Docker] Docker整體架構(gòu)圖

轉(zhuǎn)載:[Docker] Docker整體架構(gòu)圖

一耸棒、Docker的總架構(gòu)圖

docker是一個(gè)C/S模式的架構(gòu)囚企,后端是一個(gè)松耦合架構(gòu)哆料,模塊各司其職爵川。

用戶是使用Docker Client與Docker Daemon建立通信棋枕,并發(fā)送請(qǐng)求給后者白修。

Docker Daemon作為Docker架構(gòu)中的主體部分,首先提供Server的功能使其可以接受Docker Client的請(qǐng)求重斑;

Engine執(zhí)行Docker內(nèi)部的一系列工作兵睛,每一項(xiàng)工作都是以一個(gè)Job的形式的存在。

Job的運(yùn)行過程中窥浪,當(dāng)需要容器鏡像時(shí)祖很,則從Docker Registry中下載鏡像,并通過鏡像管理驅(qū)動(dòng)graphdriver將下載鏡像以Graph的形式存儲(chǔ)漾脂;

當(dāng)需要為Docker創(chuàng)建網(wǎng)絡(luò)環(huán)境時(shí)假颇,通過網(wǎng)絡(luò)管理驅(qū)動(dòng)networkdriver創(chuàng)建并配置Docker容器網(wǎng)絡(luò)環(huán)境;

當(dāng)需要限制Docker容器運(yùn)行資源或執(zhí)行用戶指令等操作時(shí)骨稿,則通過execdriver來完成笨鸡。

libcontainer是一項(xiàng)獨(dú)立的容器管理包,networkdriver以及execdriver都是通過libcontainer來實(shí)現(xiàn)具體對(duì)容器進(jìn)行的操作坦冠。

二形耗、Docker各模塊組件分析

(一)Docker Client[發(fā)起請(qǐng)求]

Docker Client是和Docker Daemon建立通信的客戶端。用戶使用的可執(zhí)行文件為docker(類似可執(zhí)行腳本的命令)辙浑,docker命令后接參數(shù)的形式來實(shí)現(xiàn)一個(gè)完整的請(qǐng)求命令(例如docker images激涤,docker為命令不可變,images為參數(shù)可變)例衍。

Docker Client可以通過以下三種方式和Docker Daemon建立通信:tcp://host:port昔期,unix://path_to_socket和fd://socketfd。

Docker Client發(fā)送容器管理請(qǐng)求后佛玄,由Docker Daemon接受并處理請(qǐng)求硼一,當(dāng)Docker Client接收到返回的請(qǐng)求相應(yīng)并簡單處理后,Docker Client一次完整的生命周期就結(jié)束了梦抢。[一次完整的請(qǐng)求:發(fā)送請(qǐng)求→處理請(qǐng)求→返回結(jié)果]般贼,與傳統(tǒng)的C/S架構(gòu)請(qǐng)求流程并無不同。

(二)Docker Daemon[后臺(tái)守護(hù)進(jìn)程]

Docker Daemon的架構(gòu)圖

Docker Server[調(diào)度分發(fā)請(qǐng)求]

Docker Server的架構(gòu)圖

Docker Server相當(dāng)于C/S架構(gòu)的服務(wù)端奥吩。功能為接受并調(diào)度分發(fā)Docker Client發(fā)送的請(qǐng)求哼蛆。接受請(qǐng)求后,Server通過路由與分發(fā)調(diào)度霞赫,找到相應(yīng)的Handler來執(zhí)行請(qǐng)求腮介。

在Docker的啟動(dòng)過程中,通過包gorilla/mux端衰,創(chuàng)建了一個(gè)mux.Router叠洗,提供請(qǐng)求的路由功能。在Golang中旅东,gorilla/mux是一個(gè)強(qiáng)大的URL路由器以及調(diào)度分發(fā)器灭抑。該mux.Router中添加了眾多的路由項(xiàng),每一個(gè)路由項(xiàng)由HTTP請(qǐng)求方法(PUT抵代、POST腾节、GET或DELETE)、URL荤牍、Handler三部分組成案腺。

創(chuàng)建完mux.Router之后,Docker將Server的監(jiān)聽地址以及mux.Router作為參數(shù)参淫,創(chuàng)建一個(gè)httpSrv=http.Server{}救湖,最終執(zhí)行httpSrv.Serve()為請(qǐng)求服務(wù)。

在Server的服務(wù)過程中涎才,Server在listener上接受Docker Client的訪問請(qǐng)求鞋既,并創(chuàng)建一個(gè)全新的goroutine來服務(wù)該請(qǐng)求。在goroutine中耍铜,首先讀取請(qǐng)求內(nèi)容邑闺,然后做解析工作,接著找到相應(yīng)的路由項(xiàng)棕兼,隨后調(diào)用相應(yīng)的Handler來處理該請(qǐng)求陡舅,最后Handler處理完請(qǐng)求之后回復(fù)該請(qǐng)求。

Engine

Engine是Docker架構(gòu)中的運(yùn)行引擎伴挚,同時(shí)也Docker運(yùn)行的核心模塊靶衍。它扮演Docker container存儲(chǔ)倉庫的角色灾炭,并且通過執(zhí)行job的方式來操縱管理這些容器。

在Engine數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)與實(shí)現(xiàn)過程中颅眶,有一個(gè)handler對(duì)象蜈出。該handler對(duì)象存儲(chǔ)的都是關(guān)于眾多特定job的handler處理訪問。舉例說明涛酗,Engine的handler對(duì)象中有一項(xiàng)為:{“create”: daemon.ContainerCreate,}铡原,則說明當(dāng)名為"create"的job在運(yùn)行時(shí),執(zhí)行的是daemon.ContainerCreate的handler商叹。

job

一個(gè)Job可以認(rèn)為是Docker架構(gòu)中Engine內(nèi)部最基本的工作執(zhí)行單元燕刻。Docker可以做的每一項(xiàng)工作,都可以抽象為一個(gè)job剖笙。例如:在容器內(nèi)部運(yùn)行一個(gè)進(jìn)程卵洗,這是一個(gè)job;創(chuàng)建一個(gè)新的容器弥咪,這是一個(gè)job忌怎。Docker Server的運(yùn)行過程也是一個(gè)job,名為serveapi酪夷。

Job的設(shè)計(jì)者榴啸,把Job設(shè)計(jì)得與Unix進(jìn)程相仿。比如說:Job有一個(gè)名稱晚岭,有參數(shù)鸥印,有環(huán)境變量,有標(biāo)準(zhǔn)的輸入輸出坦报,有錯(cuò)誤處理库说,有返回狀態(tài)等。

(三)Docker Registry[鏡像注冊(cè)中心]

Docker Registry是一個(gè)存儲(chǔ)容器鏡像的倉庫(注冊(cè)中心)片择,可理解為云端鏡像倉庫潜的,按repository來分類,docker pull 按照[repository]:[tag]來精確定義一個(gè)image字管。

在Docker的運(yùn)行過程中啰挪,Docker Daemon會(huì)與Docker Registry通信,并實(shí)現(xiàn)搜索鏡像嘲叔、下載鏡像亡呵、上傳鏡像三個(gè)功能,這三個(gè)功能對(duì)應(yīng)的job名稱分別為"search"硫戈,“pull” 與 “push”锰什。

可分為公有倉庫(docker hub)和私有倉庫。

(四)Graph[docker內(nèi)部數(shù)據(jù)庫]

Graph的架構(gòu)圖

Repository

已下載鏡像的保管者(包括下載鏡像和dockerfile構(gòu)建的鏡像)。

一個(gè)repository表示某類鏡像的倉庫(例如Ubuntu)汁胆,同一個(gè)repository內(nèi)的鏡像用tag來區(qū)分(表示同一類鏡像的不同標(biāo)簽或版本)梭姓。一個(gè)registry包含多個(gè)repository,一個(gè)repository包含同類型的多個(gè)image嫩码。

鏡像的存儲(chǔ)類型有aufs糊昙,devicemapper,Btrfs,Vfs等谢谦。其中centos系統(tǒng)使用devicemapper的存儲(chǔ)類型。

同時(shí)在Graph的本地目錄中萝衩,關(guān)于每一個(gè)的容器鏡像回挽,具體存儲(chǔ)的信息有:該容器鏡像的元數(shù)據(jù),容器鏡像的大小信息猩谊,以及該容器鏡像所代表的具體rootfs千劈。

GraphDB

已下載容器鏡像之間關(guān)系的記錄者。

GraphDB是一個(gè)構(gòu)建在SQLite之上的小型圖數(shù)據(jù)庫牌捷,實(shí)現(xiàn)了節(jié)點(diǎn)的命名以及節(jié)點(diǎn)之間關(guān)聯(lián)關(guān)系的記錄

(五)Driver[執(zhí)行部分]

Driver是Docker架構(gòu)中的驅(qū)動(dòng)模塊墙牌。通過Driver驅(qū)動(dòng),Docker可以實(shí)現(xiàn)對(duì)Docker容器執(zhí)行環(huán)境的定制暗甥。即Graph負(fù)責(zé)鏡像的存儲(chǔ)喜滨,Driver負(fù)責(zé)容器的執(zhí)行。

graphdriver

graphdriver架構(gòu)圖

graphdriver主要用于完成容器鏡像的管理撤防,包括存儲(chǔ)與獲取虽风。

存儲(chǔ):docker pull下載的鏡像由graphdriver存儲(chǔ)到本地的指定目錄(Graph中)。

獲燃脑隆:docker run(create)用鏡像來創(chuàng)建容器的時(shí)候由graphdriver到本地Graph中獲取鏡像辜膝。

networkdriver

networkdriver的架構(gòu)圖

networkdriver的用途是完成Docker容器網(wǎng)絡(luò)環(huán)境的配置,其中包括

Docker啟動(dòng)時(shí)為Docker環(huán)境創(chuàng)建網(wǎng)橋漾肮;

Docker容器創(chuàng)建時(shí)為其創(chuàng)建專屬虛擬網(wǎng)卡設(shè)備厂抖;

Docker容器分配IP、端口并與宿主機(jī)做端口映射克懊,設(shè)置容器防火墻策略等忱辅。

execdriver

execdriver的架構(gòu)圖

execdriver作為Docker容器的執(zhí)行驅(qū)動(dòng),負(fù)責(zé)創(chuàng)建容器運(yùn)行命名空間谭溉,負(fù)責(zé)容器資源使用的統(tǒng)計(jì)與限制耕蝉,負(fù)責(zé)容器內(nèi)部進(jìn)程的真正運(yùn)行等。

現(xiàn)在execdriver默認(rèn)使用native驅(qū)動(dòng)夜只,不依賴于LXC垒在。

(六)libcontainer[函數(shù)庫]

libcontainer的架構(gòu)圖

libcontainer是Docker架構(gòu)中一個(gè)使用Go語言設(shè)計(jì)實(shí)現(xiàn)的庫,設(shè)計(jì)初衷是希望該庫可以不依靠任何依賴,直接訪問內(nèi)核中與容器相關(guān)的API场躯。

Docker可以直接調(diào)用libcontainer谈为,而最終操縱容器的namespace、cgroups踢关、apparmor伞鲫、網(wǎng)絡(luò)設(shè)備以及防火墻規(guī)則等。

libcontainer提供了一整套標(biāo)準(zhǔn)的接口來滿足上層對(duì)容器管理的需求签舞★跖В或者說,libcontainer屏蔽了Docker上層對(duì)容器的直接管理儒搭。

(七)docker container[服務(wù)交付的最終形式]

container架構(gòu)

Docker container(Docker容器)是Docker架構(gòu)中服務(wù)交付的最終體現(xiàn)形式吠架。

Docker按照用戶的需求與指令,訂制相應(yīng)的Docker容器:

用戶通過指定容器鏡像搂鲫,使得Docker容器可以自定義rootfs等文件系統(tǒng)傍药;

用戶通過指定計(jì)算資源的配額,使得Docker容器使用指定的計(jì)算資源魂仍;

用戶通過配置網(wǎng)絡(luò)及其安全策略拐辽,使得Docker容器擁有獨(dú)立且安全的網(wǎng)絡(luò)環(huán)境;

用戶通過指定運(yùn)行的命令擦酌,使得Docker容器執(zhí)行指定的工作俱诸。

附:本文在《docker源碼分析》基礎(chǔ)上進(jìn)行整理。

推薦文章

[Docker] 安裝Docker

[Docker] Docker常用命令原理圖

[Docker] Dockerfile使用說明

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末赊舶,一起剝皮案震驚了整個(gè)濱河市乙埃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锯岖,老刑警劉巖介袜,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異出吹,居然都是意外死亡遇伞,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門捶牢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鸠珠,“玉大人,你說我怎么就攤上這事秋麸〗ヅ牛” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵灸蟆,是天一觀的道長驯耻。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么可缚? 我笑而不...
    開封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任霎迫,我火速辦了婚禮,結(jié)果婚禮上帘靡,老公的妹妹穿的比我還像新娘知给。我一直安慰自己,他們只是感情好描姚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開白布涩赢。 她就那樣靜靜地躺著,像睡著了一般轩勘。 火紅的嫁衣襯著肌膚如雪筒扒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天赃阀,我揣著相機(jī)與錄音,去河邊找鬼擎颖。 笑死榛斯,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的搂捧。 我是一名探鬼主播驮俗,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼允跑!你這毒婦竟也來了王凑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤聋丝,失蹤者是張志新(化名)和其女友劉穎索烹,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弱睦,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡百姓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了况木。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片垒拢。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖火惊,靈堂內(nèi)的尸體忽然破棺而出求类,到底是詐尸還是另有隱情,我是刑警寧澤屹耐,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布尸疆,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏仓技。R本人自食惡果不足惜鸵贬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望脖捻。 院中可真熱鬧阔逼,春花似錦、人聲如沸地沮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽摩疑。三九已至危融,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間雷袋,已是汗流浹背吉殃。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留楷怒,地道東北人蛋勺。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像鸠删,于是被迫代替她去往敵國和親抱完。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

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

  • docker對(duì)于使用者來說其實(shí)是一個(gè)c/s模式的架構(gòu)刃泡。 docker分為server端和client端巧娱,docke...
    WarPrint24閱讀 409評(píng)論 0 0
  • 原文發(fā)布在:http://cizixs.com/2016/04/06/docker-images,轉(zhuǎn)載請(qǐng)注明出處烘贴。...
    cizixs閱讀 2,706評(píng)論 1 16
  • docker最基本的知識(shí)點(diǎn) 用的最多的就是run命令(備注:在macos下需要使用 docker + 命令禁添,在ub...
    00我的那個(gè)她呢閱讀 1,173評(píng)論 0 1
  • 地藏王菩薩說:眾生度盡,方證菩提桨踪。 我見你時(shí)上荡,倏然想到這句。 有些記憶就募地?cái)嗥疲缓罅鞒鋈秩崆椤?世人聚散離合...
    清泰閱讀 502評(píng)論 8 6
  • 女兒最近的口頭禪:哇酪捡,好酷喲!我記得以前無論你說什么纳账,她都會(huì)說:嗚逛薇!驚訝之前溢于言表。 媽媽疏虫,我長大就會(huì)飛了永罚。 跟...
    幸福像花兒一樣6閱讀 136評(píng)論 0 2