国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

Docker技術(shù)的移植性分析研究

2015-12-25 08:59于燁李斌劉思堯
軟件 2015年7期

于燁++李斌++劉思堯

摘要:Docker因?yàn)槠漭p量、便捷的特點(diǎn),受了業(yè)界廣泛的關(guān)注和討論,目前已有多個(gè)相關(guān)項(xiàng)目,逐漸形成了圍繞Docker的生態(tài)體系。Docker的核心思想是利用擴(kuò)展的LXC(Linux Container)方案實(shí)現(xiàn)一種輕量級(jí)的虛擬化解決方案。Docker主要利用AUFS機(jī)制來(lái)實(shí)現(xiàn)系統(tǒng)的移植性,節(jié)省了存儲(chǔ)和內(nèi)存,也保證了容器的快速部署。本文從AUFS的實(shí)現(xiàn)原理入手,詳細(xì)分析了Docker的移動(dòng)應(yīng)用部署的原理和可行性。

關(guān)鍵詞:Docker;AUFS;文件系統(tǒng);移植性

中圖分類號(hào):TP311

文獻(xiàn)標(biāo)識(shí)碼:A

DOI: 10.3969/j.issn.1003-6970.2015.07.012

0 引言

Docker是dotcloud公司于2013初年開始的一個(gè)開源項(xiàng)目,最早是該公司已有的云業(yè)務(wù)的一個(gè)自然擴(kuò)展技術(shù)。Docker對(duì)容器的使用基本是建立在LXC基礎(chǔ)之上的,然而LXC存在的問題是難以移動(dòng),即難以通過(guò)標(biāo)準(zhǔn)化的模板制作、重建、復(fù)制和移動(dòng)容器。在以VM為基礎(chǔ)的虛擬化手段中,有image和snapshot可以用于VM的復(fù)制、重建以及移動(dòng)的功能。想要通過(guò)容器來(lái)實(shí)現(xiàn)快速的大規(guī)模部署和更新,這些功能不可或缺。針對(duì)這樣的問題,Docker利用AUFS來(lái)實(shí)現(xiàn)對(duì)容器的快速更新,Docker0.7中引入了Storage Driver,支持AUFS,VFS,Device Mapper,也為BTRFS以及ZFS的引入提供了可能。

1 Docker簡(jiǎn)介

Docker是PaaS提供商dotCloud開源的一個(gè)基于LXC(Linux Container)的應(yīng)用容器引擎,讓開發(fā)者可以將應(yīng)用程序、依賴的運(yùn)行庫(kù)文件打包并移植到一個(gè)新的容器中,然后發(fā)布到任何系統(tǒng)為L(zhǎng)inux的機(jī)器上,也可以實(shí)現(xiàn)虛擬化解決方案。容器是完全沙箱機(jī)制的實(shí)現(xiàn)方式,任意容器之間不會(huì)有任何接口,具有安全訪問資源的特性,可以實(shí)現(xiàn)系統(tǒng)的隔離;而且容器的運(yùn)行資源開銷小,可以很容易地在機(jī)器和數(shù)據(jù)中心中運(yùn)行。最重要的是Docker容器不依賴于任何特定需求實(shí)現(xiàn)的編程語(yǔ)言、編程框架或已打包的系統(tǒng)。Docker目前在業(yè)界非常受歡迎,包括dotCloud, Google Compute Engine和百度應(yīng)用引擎(BAE),都使用了Docker。

Docker容器主要解決“依賴地獄”的問題,即應(yīng)用通常從已存在的組件組合而來(lái),并且依賴其他服務(wù)和應(yīng)用。例如,Python應(yīng)用可能使用Postgre所為一個(gè)數(shù)據(jù)存儲(chǔ),用Redis緩存以及使用Apache作web服務(wù)器。每個(gè)這些組件都附帶自身的一些依賴,這些依賴可能與其他組件產(chǎn)生沖突。通過(guò)打包每個(gè)組件及其依賴,Docker容器解決沖突依賴、缺少依賴、平臺(tái)依賴等問題。

2 Docker的移植性

2.1 AUFS簡(jiǎn)介

AUFS (AnotherUnionFS)是一種Union FS,簡(jiǎn)單來(lái)說(shuō)就是支持將不同目錄掛載到同一個(gè)虛擬文件系統(tǒng)下(unite several directories into a single virtual filesystem)的文件系統(tǒng),更進(jìn)一步地,AUFS支持為每一個(gè)成員目錄(AKA branch)設(shè)定readonly,readwrite和whiteout-able權(quán)限,同時(shí)AUFS里有一個(gè)類似分層的概念,對(duì)readonly權(quán)限的branch可以邏輯上進(jìn)行修改(增量地,不影響readonly部分的)。通常Union FS有兩個(gè)用途,一方面可以實(shí)現(xiàn)不借助LVM,RAID將多個(gè)disk和掛在到一個(gè)目錄下,另一個(gè)更常用的就是將一個(gè)readonly的branch和一個(gè)writeable的branch聯(lián)合在一起,Live CD正是基于此可以允許在OS image不變的基礎(chǔ)上允許用戶在其上進(jìn)行一些寫操作。

2.2 Docker的移植性分析

Docker使用AuFS作為容器的文件系統(tǒng)。AuFS的層狀文件系統(tǒng)能夠透明覆蓋一個(gè)或多個(gè)現(xiàn)有文件系統(tǒng)。當(dāng)一個(gè)進(jìn)程需要修改一個(gè)文件時(shí),AuFS創(chuàng)建該文件的一個(gè)副本。AuFS可以通過(guò)寫復(fù)制把多層合并成文件系統(tǒng)的單層表示。AuFS允許Docker把某些鏡像作為容器的基礎(chǔ)。例如,利用AuFS的機(jī)制,只需要一個(gè)CentOS鏡像的副本就可以作為很多不同容器的基礎(chǔ),既節(jié)省了存儲(chǔ)和內(nèi)存,也保證了容器的快速部署。

使用AuFS的另一個(gè)好處是提升了Docker的版本容器鏡像能力。每個(gè)新版本都是一個(gè)與之前版本的簡(jiǎn)單差異改動(dòng),有效地保持鏡像文件最小化。但這也意味著需要一個(gè)記錄該容器從一個(gè)版本到另一個(gè)版本改動(dòng)的審計(jì)跟蹤。

AUFS是一種Union FS,它是一種支持將不同目錄掛載到同一個(gè)虛擬文件系統(tǒng)下的文件系統(tǒng),并且支持為每一個(gè)成員目錄(AKA branch)設(shè)定‘readonly,‘readwrite和 ‘whiteout-able權(quán)限,同時(shí)AUFS里有一個(gè)類似分層的概念,對(duì)readonly權(quán)限的branch可以邏輯上進(jìn)行修改。通常Union FS有兩個(gè)用途,一方面可以實(shí)現(xiàn)不借助LVM, RAID將多個(gè)disk和掛在到一個(gè)目錄下,另一個(gè)更常用的就是將一個(gè)readonly的branch和一個(gè)writeable的branch聯(lián)合在一起,Live CD正是基于此可以允許在OS image不變的基礎(chǔ)上允許用戶在其上進(jìn)行一些寫操作。Docker在AUFS上構(gòu)建的container image也正是如此。

典型的Linux啟動(dòng)到運(yùn)行需要兩個(gè)FS:bootfs和rootfs(從功能角度而非文件系統(tǒng)角度),如圖1所示。

bootfs (boot file system)主要包含bootloader和kernel,bootloader主要用于引導(dǎo)加載kernel,當(dāng)boot成功后,kernel被加載到內(nèi)存中,bootfs就被umount了。endprint

rootfs (root file system)包含典型Linux系統(tǒng)中的/dev,/proc,/bin,/etc等標(biāo)準(zhǔn)目錄和文件。

由此可見對(duì)于不同的linux發(fā)行版,bootfs基本是一致的,rootfs會(huì)有差別,因此不同的發(fā)行版可以公用bootfs如圖2所示。

典型的Linux在啟動(dòng)后,首先將rootfs置為readonly,進(jìn)行一系列檢查,然后將其切換為readwrite供用戶使用。在docker中,最初也是將rootfs以readonly方式加載并檢查,接下來(lái)利用unionmount將一個(gè)readwrite文件系統(tǒng)掛載在readonly的rootfs之上,允許再次將下層的file system設(shè)定為readonly并向上疊加,這樣以來(lái)一組readonly和一個(gè)writeable的結(jié)構(gòu)就構(gòu)成一個(gè)container的運(yùn)行目錄,每一個(gè)運(yùn)行目錄被稱作一個(gè)Layer,如圖3所示。

得益于AUFS的特性,每一個(gè)對(duì)readonly層文件或文件目錄的修改都只會(huì)存在于上層的writeable層中。這樣就可以避免競(jìng)爭(zhēng),使多個(gè)container可以共享readonly的layer。

因此docker將readonly的層稱作“image”,對(duì)于容器而言整個(gè)rootfs都是read-write的,但事實(shí)上所有的修改都寫入最上層的writeable層中,image不保存用戶狀態(tài),可以用于模板、重建和復(fù)制。

上層的image依賴下層的image,因此docker中把下層的image稱作父image,沒有父image的image稱作base image,如圖4所示。

因此想要從一個(gè)image啟動(dòng)一個(gè)容器,docker會(huì)先加載其父image直到base image,用戶的進(jìn)程運(yùn)行在writeable的layer中。所有parent image中的數(shù)據(jù)信息以及ID、網(wǎng)絡(luò)和lxc管理的資源限制等具體container的配置,構(gòu)成一個(gè)docker概念上的容器,如圖5所示。

由此可見,采用AUFS作為docker的容器文件系統(tǒng),能夠提供如下好處:

(1)節(jié)省存儲(chǔ)空間:多個(gè)容器可以共享base image存儲(chǔ);

(2)快速部署:如果要部署多個(gè)容器,base image可以避免多次拷貝;

(3)內(nèi)存更?。阂?yàn)槎鄠€(gè)容器共享base image,以及OS的disk緩存機(jī)制,多個(gè)容器中的進(jìn)程命中緩存內(nèi)容的幾率大大增加;

(4)升級(jí)更方便:相比于copy-on-write類型的FS,base-image也可以掛載為可writeable的,可以通過(guò)更新base image而一次性更新其之上的容器;

(5)允許在不更改base-image的同時(shí)修改其目錄中的文件:所有寫操作都發(fā)生在最上層的writeable層中,這樣可以大大增加base image能共享的文件內(nèi)容。

以上5條中,1-3條可以通過(guò)copy-on-write的FS實(shí)現(xiàn),4可以利用其他的union mount方式實(shí)現(xiàn),5只有AUFS實(shí)現(xiàn)的很好。這也是為什么Docker一開始就建立在AUFS之上。

3 結(jié)論

Docker使用AuFS作為容器的文件系統(tǒng)。AUFS是一種Union FS,它是一種支持將不同目錄掛載到同一個(gè)虛擬文件系統(tǒng)下的文件系統(tǒng),并且為每一個(gè)成員目錄(AKA branch)設(shè)定不同的權(quán)限,并基于一種分層的概念,對(duì)這些權(quán)限從邏輯上進(jìn)行修改。節(jié)省了存儲(chǔ)和內(nèi)存,保證了容器的快速部署和升級(jí)的便捷性。endprint

瑞丽市| 汽车| 磐安县| 西平县| 北海市| 宜阳县| 岗巴县| 佳木斯市| 陵水| 亳州市| 南宫市| 沈丘县| 罗江县| 伊宁市| 平遥县| 镇赉县| 桐柏县| 鹤壁市| 黑河市| 松溪县| 延吉市| 锦州市| 和平区| 岐山县| 林芝县| 西林县| 海伦市| 镇康县| 沙洋县| 庄浪县| 临安市| 崇信县| 桦南县| 仙桃市| 阿克陶县| 怀集县| 抚顺县| 广宁县| 禄劝| 临潭县| 敦煌市|