docker對(duì)于使用者來說其實(shí)是一個(gè)c/s模式的架構(gòu)。
docker分為server端和client端却音,docker后端其實(shí)是一個(gè)松耦合的架構(gòu)改抡,模塊之間各司其職,并有機(jī)的組合起來支持docker的運(yùn)行系瓢。
docker的總體架構(gòu)圖如下:
docker client與docker daemon 進(jìn)行通信阿纤,docker daemon 首先提供了一個(gè)server的功能,而后通過Engine與后端模塊進(jìn)行通信夷陋。
Docker Registry作用是存儲(chǔ)鏡像欠拾,可以是docker hub,也可以是內(nèi)網(wǎng)私有庫(kù)
Graph作用是管理已下載鏡像和鏡像之間的依賴關(guān)系(通過GraphDB記錄)
Docker Daemon回一個(gè)docker系統(tǒng)的常駐后臺(tái)的一個(gè)服務(wù)骗绕,通過自己的路由分發(fā)制度處理docker client的請(qǐng)求藐窄,并將請(qǐng)求解析到對(duì)應(yīng)的handler,Engine通過handler來執(zhí)行一個(gè)job
Job的設(shè)計(jì)者酬土,把Job設(shè)計(jì)得與Unix進(jìn)程相仿荆忍。比如說:Job有一個(gè)名稱,有參數(shù)撤缴,有環(huán)境變量刹枉,有標(biāo)準(zhǔn)的輸入輸出,有錯(cuò)誤處理屈呕,有返回狀態(tài)等微宝。
Driver是Docker架構(gòu)中的驅(qū)動(dòng)模塊。通過Driver驅(qū)動(dòng)凉袱,Docker可以實(shí)現(xiàn)對(duì)Docker容器執(zhí)行環(huán)境的定制芥吟。由于Docker運(yùn)行的生命周期中,并非用戶所有的操作都是針對(duì)Docker容器的管理专甩,另外還有關(guān)于Docker運(yùn)行信息的獲取钟鸵,Graph的存儲(chǔ)與記錄等。因此涤躲,為了將Docker容器的管理從Docker?Daemon內(nèi)部業(yè)務(wù)邏輯中區(qū)分開來棺耍,設(shè)計(jì)了Driver層驅(qū)動(dòng)來接管所有這部分請(qǐng)求锡足。
在Docker Driver的實(shí)現(xiàn)中舒帮,可以分為以下三類驅(qū)動(dòng):graphdriver托享、networkdriver和execdriver玄坦。
graphdriver主要用于完成容器鏡像的管理,包括存儲(chǔ)與獲取害幅。即當(dāng)用戶需要下載指定的容器鏡像時(shí)消恍,graphdriver將容器鏡像存儲(chǔ)在本地的指定目錄;同時(shí)當(dāng)用戶需要使用指定的容器鏡像來創(chuàng)建容器的rootfs時(shí)以现,graphdriver從本地鏡像存儲(chǔ)目錄中獲取指定的容器鏡像
graphdriver的初始化過程之前狠怨,有4種文件系統(tǒng)或類文件系統(tǒng)在其內(nèi)部注冊(cè),它們分別是aufs邑遏、btrfs佣赖、vfs和devmapper
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作為Docker容器的執(zhí)行驅(qū)動(dòng)俩檬,負(fù)責(zé)創(chuàng)建容器運(yùn)行命名空間,負(fù)責(zé)容器資源使用的統(tǒng)計(jì)與限制彬碱,負(fù)責(zé)容器內(nèi)部進(jìn)程的真正運(yùn)行等豆胸。在execdriver的實(shí)現(xiàn)過程中,原先可以使用LXC驅(qū)動(dòng)調(diào)用LXC的接口巷疼,來操縱容器的配置以及生命周期晚胡,而現(xiàn)在execdriver默認(rèn)使用native驅(qū)動(dòng),不依賴于LXC嚼沿。具體體現(xiàn)在Daemon啟動(dòng)過程中加載的ExecDriverflag參數(shù)估盘,該參數(shù)在配置文件已經(jīng)被設(shè)為"native"。這可以認(rèn)為是Docker在1.2版本上一個(gè)很大的改變骡尽,或者說Docker實(shí)現(xiàn)跨平臺(tái)的一個(gè)先兆
libcontainer是Docker架構(gòu)中一個(gè)使用Go語(yǔ)言設(shè)計(jì)實(shí)現(xiàn)的庫(kù)遣妥,設(shè)計(jì)初衷是希望該庫(kù)可以不依靠任何依賴,直接訪問內(nèi)核中與容器相關(guān)的API攀细。
正是由于libcontainer的存在箫踩,Docker可以直接調(diào)用libcontainer,而最終操縱容器的namespace谭贪、cgroups境钟、apparmor、網(wǎng)絡(luò)設(shè)備以及防火墻規(guī)則等俭识。這一系列操作的完成都不需要依賴LXC或者其他包慨削,libcontainer提供了一整套標(biāo)準(zhǔn)的接口來滿足上層對(duì)容器管理的需求。或者說缚态,libcontainer屏蔽了Docker上層對(duì)容器的直接管理磁椒。又由于libcontainer使用Go這種跨平臺(tái)的語(yǔ)言開發(fā)實(shí)現(xiàn),且本身又可以被上層多種不同的編程語(yǔ)言訪問