1. 程式人生 > >基於Docker技術的容器隔離性分析

基於Docker技術的容器隔離性分析

【摘要】Docker技術是一種基於Linux作業系統核心的虛擬化技術,其主要在於藉助對LXC(Linux Container)的擴充套件而達到一種虛擬化的解決方案。其能夠保障每一個容器中服務的執行環境是保持隔離的,這主要是通過核心名稱空間的特性來完成。由於Docker隔離機制的獨特性,執行資源的開銷較低,能夠很好地保障虛擬化的密度。文章基於Docker的工作原理展開研究,對Docker的虛擬化隔離技術及容器隔離方案做出了詳盡的分析與討論。

【關鍵詞】Docker技術;隔離性;虛擬化

Docker是一個基於LXC的高階應用容器引擎,其進一步優化了容器的使用體驗,提供了容器管理的一些功能,如容器的版本管理、容器釋出、容器移植等,讓使用者更方便的使用容器。Docker具備簡化配置的優點,其能夠讓開發者把應用程式以及程式所依靠的執行環境和配置檔案一同打包,達到“Build Once,Run Everywhere”的目標,具備資源安全訪問的特質,能夠完成系統的隔離,具備輕量虛擬化的特質,與傳統虛擬化對比,其具有啟動速度更快與佔用的資源較少的優點。Docker最重要的特點在於其支援由任何程式語言和框架開發的應用程式

,使得Docker在網際網路領域被廣泛使用。

1.Docker技術原理

    使用者使用Docker客戶端與DockerDaemon建立通訊,Docker Daemon提供Server的功能使其可以接受Docker客戶端的請求;Engine以任務的形式處理Docker的內部工作,如從映象倉庫下載映象並以Graph的形式儲存,建立Docker容器網路,限制Docker資源配額及者執行使用者指令等;Libcontainer是一項獨立的容器管理包,實現對容器的具體操作。Docker客戶端與Docker Daemon能夠通過RESTful或socket介面通訊。其結構模式詳見圖1。

圖1 Docker結構

2 Docker與虛機機的比較

 

目前流行的完全虛擬化就是使用了Hypervisor軟體將底層硬體進行了抽象模擬,其好處在於可以支援針對物理硬體設計的作業系統及軟體,且支援多個異構的GuestOS,提供了較好的GuestOS的獨立性。但是其缺點是損失部分系統效能。

容器是基於Linux核心的虛擬化技術,其依賴核心的相關特性實現隔離,與完全虛擬化的虛擬機器不同,它不需要Hypervisor實現虛擬化宿主機的物理硬體,而是直接使用實際的物理硬體資源,更像是一個應用程式與宿主機之間的互動。此外,容器使用宿主機的核心,,省略了核心載入步驟,啟動更加快速。

3.隔離性

由於每個虛擬機器都有自己的GuestOS,從而保證了虛擬機器之間的隔離,進而達到同一宿主機上不同虛擬機器間互不干擾的目的。Docker容器是藉助系統核心來進行安全性的隔離。即是通過namespace進行隔離、cgroup進行資源限制、capability進行許可權限制。

         但同一臺宿主機的核心卻是共享的,多個容器的系統呼叫其實都是通過宿主機的核心處理,這為Docker留下了一定的安全隱患。因此,我們應該認識到容器並不是全封閉隔離的。

3.1使用者名稱空間隔離

    Docker容器使用了Linux核心中提供的6種名稱空間隔離:

1)        UTS名稱空間負責主機名和域名的隔離,使得容器都擁有自己的主機名和域名,可以被看作一個獨立的網路節點。

2)        IPC名稱空間負責訊號量、訊息佇列和共享記憶體的隔離,其包含了系統IPC標示符以及實現POSIX訊息佇列的檔案系統,使得同一個IPC名稱空間下的程序彼此可見,不同的則相互不可見;

3)        PID名稱空間負責程序PID編號的隔離,不同的PID名稱空間下的程序可以有相同的PID,每個PID名稱空間都有獨立的計數程式。

4)        Network名稱空間負責網路資源的隔離,這裡的隔離並非真正意義的網路隔離,而是把容器的網路獨立出來,如同一個獨立的網路實體來與外部通訊。

5)        Mount名稱空間負責掛載點的隔離,不同Mount名稱空間下的檔案結構發生變化互不影響。

6)        User名稱空間負責安全相關的標示符和屬性的隔離,包括使用者ID、使用者組ID、root目錄、金鑰key以及特殊許可權等,該名稱空間技術支援程序在容器內外擁有不同級別的許可權。

3.2cgroup資源限制

    Docker容器通過cgroup來實現組程序並管理它們的資源總消耗,分享可用的硬體資源到容器並限制容器的記憶體和CPU的使用,cgroup提供了以下4大功能:

1)        資源限制:對任務使用的資源總量進行限制,如應用在執行時超過上限配額就會給與提示;

2)        優先順序分配:通過分配的CPU時間片數量及磁碟IO頻寬大小,實際上就相當於控制了任務的優先順序;

3)        資源統計:可以統計系統的資源使用量,如CPU、記憶體等使用情況;

4)        任務控制:可以對任務進行掛起、恢復等操作。  

3.3 capability許可權限制

         從Linux核心2.2版本開始,Linux支援把超級使用者不同單元的許可權分離,可以單獨的開啟和禁止,即capability的概念。可以將capability賦給普通的程序,使其可以做root使用者可以做的事情。核心在驗證程序是否具有某項許可權時,不再驗證該程序的是特權程序(有效使用者ID為0)和非特權程序(有效使用者ID非0),而是驗證該程序是否具有其進行該操作的capability。不合理的禁止capability,會導致應用崩潰。目前Docker預設啟用一個嚴格capability限制許可權,同時支援開發者通過命令列來改變其預設設定,保障可用性的同時又可以確保其安全。

4.結束語

Docker技術通過LXC來實現輕量級的虛擬化,通過namespace進行隔離、cgroup進行資源限制、capability進行許可權限制,以滿足容器的安全隔離。然而由於Docker容器是共享Linux核心的,所以我們應該認識到容器並非嚴格全封閉,使用Docker容器一定需要注意保證核心的安全和穩定,需要配合必要的監控和容錯。

參考文獻

[1]劉思堯,李強,李斌.基於Docker技術的容器隔離性研究[J].軟體,2015,(04):110-113.

[2]馬越,黃剛.基於Docker的應用軟體虛擬化研究[J].軟體,2015,(03):10-14.

[3]楊莎莎,鄒華.託管Paas平臺安全容器的設計與實現[J].軟體,2012,33(12):15.