中國(guó)聯(lián)合網(wǎng)絡(luò)通信有限公司軟件研究院 蔡志強(qiáng)
基于Docker技術(shù)的容器隔離性分析
中國(guó)聯(lián)合網(wǎng)絡(luò)通信有限公司軟件研究院 蔡志強(qiáng)
Docker技術(shù)是一種基于Linux操作系統(tǒng)內(nèi)核的虛擬化技術(shù),其主要在于借助對(duì)LXC(Linux Container)的擴(kuò)展而達(dá)到一種虛擬化的解決方案。其能夠保障每一個(gè)容器中服務(wù)的運(yùn)行環(huán)境是保持隔離的,這主要是通過(guò)內(nèi)核命名空間的特性來(lái)完成。由于Docker隔離機(jī)制的獨(dú)特性,運(yùn)行資源的開(kāi)銷(xiāo)較低,能夠很好地保障虛擬化的密度。文章基于Docker的工作原理展開(kāi)研究,對(duì)Docker的虛擬化隔離技術(shù)及容器隔離方案做出了詳盡的分析與討論。
Docker技術(shù);隔離性;虛擬化
Docker是一個(gè)基于LXC的高級(jí)應(yīng)用容器引擎,其進(jìn)一步優(yōu)化了容器的使用體驗(yàn),提供了容器管理的一些功能,如容器的版本管理、容器發(fā)布、容器移植等,讓使用者更方便的使用容器。Docker具備簡(jiǎn)化配置的優(yōu)點(diǎn),其能夠讓開(kāi)發(fā)者把應(yīng)用程序以及程序所依靠的運(yùn)行環(huán)境和配置文件一同打包,達(dá)到“Build Once, Run Everywhere”的目標(biāo),具備資源安全訪問(wèn)的特質(zhì),能夠完成系統(tǒng)的隔離,具備輕量虛擬化的特質(zhì),與傳統(tǒng)虛擬化對(duì)比,其具有啟動(dòng)速度更快、占用的資源較少的優(yōu)點(diǎn)。Docker最重要的特點(diǎn)在于其支持由任何編程語(yǔ)言和框架開(kāi)發(fā)的應(yīng)用程序,使得Docker在互聯(lián)網(wǎng)領(lǐng)域被廣泛使用。
用戶使用Docker客戶端與Docker Daemon建立通訊,Docker Daemon提供Server的功能使其可以接受Docker客戶端的請(qǐng)求;Engine以任務(wù)的形式處理Docker的內(nèi)部工作,如從鏡像倉(cāng)庫(kù)下載鏡像并以Graph形式保存、建立Docker容器網(wǎng)絡(luò),限制Docker資源配額及執(zhí)行用戶指令等;Libcontainer是一項(xiàng)獨(dú)立的容器管理包,實(shí)現(xiàn)對(duì)容器的具體操作。Docker 客戶端與Docker Daemon能夠通過(guò)REST-ful或socket接口通訊。其結(jié)構(gòu)模式詳見(jiàn)圖1。
圖1 Docker結(jié)構(gòu)
目前流行的完全虛擬化就是使用了Hypervisor軟件將底層硬件進(jìn)行了抽象模擬,其的好處在于可以支持針對(duì)物理硬件設(shè)計(jì)的操作系統(tǒng)及軟件,且支持多個(gè)異構(gòu)的GuestOS,提供了較好的GuestOS的獨(dú)立性,但是其缺點(diǎn)是會(huì)損失部分的系統(tǒng)性能。
容器是基于Linux內(nèi)核的虛擬化技術(shù),其依賴內(nèi)核的相關(guān)特性實(shí)現(xiàn)隔離,與完全虛擬化的虛擬機(jī)不同,它不需要Hypervisor實(shí)現(xiàn)虛擬化宿主機(jī)的物理硬件,而是直接使用實(shí)際的物理硬件資源,更像是一個(gè)應(yīng)用程序與宿主機(jī)之間的交互。此外,容器使用宿主機(jī)的內(nèi)核,省略了內(nèi)核加載的步驟,啟動(dòng)更加快速。
由于每個(gè)虛擬機(jī)都有自己的GuestOS,從而保證了虛擬機(jī)之間的隔離,進(jìn)而達(dá)到同一宿主機(jī)上不同虛擬機(jī)間互不干擾的目的。Docker容器則是借助系統(tǒng)內(nèi)核來(lái)進(jìn)行安全性隔離,即通過(guò)namespace進(jìn)行隔離、cgroup進(jìn)行資源限制、capability進(jìn)行權(quán)限限制。但同一臺(tái)宿主機(jī)的系統(tǒng)內(nèi)核卻是共享的,多個(gè)容器的系統(tǒng)調(diào)用均是通過(guò)宿主機(jī)的內(nèi)核處理,這為容器留下了一定的安全隱患。因此,我們應(yīng)該認(rèn)識(shí)到容器并不是全封閉隔離的。
Docker容器使用了Linux內(nèi)核中提供的6種命名空間隔離:
1)UTS 命名空間負(fù)責(zé)主機(jī)名和域名的隔離,使得容器都擁有自己的主機(jī)名和域名,可以被看作為一個(gè)獨(dú)立的網(wǎng)絡(luò)節(jié)點(diǎn)。
2)IPC命名空間負(fù)責(zé)信號(hào)量、消息隊(duì)列和共享內(nèi)存的隔離,其包含了系統(tǒng)IPC標(biāo)示符以及實(shí)現(xiàn)POSIX消息隊(duì)列的文件系統(tǒng),使得同一個(gè)IPC命名空間下的進(jìn)程彼此可見(jiàn),不同的則相互不可見(jiàn);
3)PID命名空間負(fù)責(zé)進(jìn)程PID編號(hào)的隔離,不同的PID命名空間下的進(jìn)程可以有相同的PID,每個(gè)PID命名空間都有獨(dú)立的計(jì)數(shù)程序。
4)Network命名空間負(fù)責(zé)網(wǎng)絡(luò)資源的隔離,這里的隔離并非真正意義的網(wǎng)絡(luò)隔離,而是把容器的網(wǎng)絡(luò)獨(dú)立出來(lái),如同一個(gè)獨(dú)立的網(wǎng)絡(luò)實(shí)體來(lái)與外部通信。
5)Mount命名空間負(fù)責(zé)掛載點(diǎn)的隔離,不同Mount命名空間下的文件夠發(fā)生變化互不影響。
6)User命名空間負(fù)責(zé)安全相關(guān)的標(biāo)示符和屬性的隔離,包括用戶ID、用戶組ID、root目錄、密鑰key以及特殊權(quán)限等,該命名空間技術(shù)支持進(jìn)程在容器內(nèi)外可以擁有不同級(jí)別的權(quán)限。
Docker容器通過(guò)cgroup來(lái)實(shí)現(xiàn)組進(jìn)程并管理它們的資源總消耗,分享可用的硬件資源到容器并限制容器的內(nèi)存和CPU的使用,cgroup提供了以下4大功能:
1)資源限制:對(duì)任務(wù)使用的資源總量進(jìn)行限制,如應(yīng)用在運(yùn)行時(shí)超過(guò)上限配額就會(huì)給與提示;
2)優(yōu)先級(jí)分配:通過(guò)分配的CPU時(shí)間片數(shù)量及磁盤(pán)IO帶寬大小,實(shí)際上就相當(dāng)于控制了任務(wù)的優(yōu)先級(jí);
3)資源統(tǒng)計(jì):可以統(tǒng)計(jì)系統(tǒng)的資源使用量,如CPU、內(nèi)存等使用情況;
4)任務(wù)控制:可以對(duì)任務(wù)進(jìn)行掛起、恢復(fù)等操作。
從Linux內(nèi)核2.2版本開(kāi)始,Linux支持把超級(jí)用戶不同單元的權(quán)限分離,可以單獨(dú)的開(kāi)啟和禁止,即capability的概念。可以將capability賦給普通的進(jìn)程,使其可以做root用戶可以做的事情。內(nèi)核在驗(yàn)證進(jìn)程是否具有某項(xiàng)權(quán)限時(shí),不再驗(yàn)證該進(jìn)程的是特權(quán)進(jìn)程(有效用戶ID為0)和非特權(quán)進(jìn)程(有效用戶ID非0),而是驗(yàn)證該進(jìn)程是否具有其進(jìn)行該操作的capability。不合理的禁止capability,會(huì)導(dǎo)致應(yīng)用崩潰。目前Docker默認(rèn)啟用一個(gè)嚴(yán)格capability限制權(quán)限,同時(shí)支持開(kāi)發(fā)者通過(guò)命令行來(lái)改變其默認(rèn)設(shè)置,保障可用性的同時(shí)又可以確保其安全。
Docker技術(shù)通過(guò)LXC來(lái)實(shí)現(xiàn)輕量級(jí)的虛擬化,通過(guò)namespace進(jìn)行隔離、cgroup進(jìn)行資源限制、capability進(jìn)行權(quán)限限制,以滿足容器的安全隔離。然而由于Docker容器是共享Linux內(nèi)核的,所以我們應(yīng)該認(rèn)識(shí)到容器并非嚴(yán)格全封閉,使用Docker容器一定需要注意保證內(nèi)核的安全和穩(wěn)定,并配合必要的監(jiān)控和容錯(cuò)。
[1]劉思堯,李強(qiáng),李斌.基于Docker技術(shù)的容器隔離性研究[J].軟件,2015,(04):110-113.
[2]馬越,黃剛.基于Docker的應(yīng)用軟件虛擬化研究[J].軟件,2015,(03): 10-14.
[3]楊莎莎,鄒華.托管Paas平臺(tái)安全容器的設(shè)計(jì)與實(shí)現(xiàn)[J].軟件,2012, 33(12):15.