docker隔離技術

docker底層的 2 個核心技術分別是 Namespaces 和 Control groups

namespace:Linux命名空間,實現進程間信息的獨立與隔離需要在操作系統內核層面進行實現的

Mount Namespaces:掛載命名空間,用於隔離掛載目錄

爲什麼要通過Mount namespace隔離掛載目錄?
如果說隔離在某個namespace中的程序,可所掛載的目錄進行修改,那麼另一個nemaspace中運行的程序也能察覺到,這樣就在無形之中影響了其他Namespace中程序的運行,顯然達不達這樣的隔離效果;
所以要進行程序之間的隔離,
首先是要把程序所使用的掛載目錄進行隔離,讓不同的Nemaspaces擁有獨立掛載結構,而程序對掛載信息的修改,也不會影響到其他的namespace中程序的運行;

UTS Namespaces:UTS命名空間,用於隔離主機及網絡域等信息

通過UTS命名空間,可以爲不同的Namespaces設置不同的主機名和網絡域 能夠簡單的將程序隔離到一個獨立的網絡命名空間

IPC Namespaces:用於隔離進程之間的調用,也就是隔離進程之間的通信;

通過UTS命名空間,可以爲不同的Namespaces設置不同的主機名和網絡域 能夠簡單的將程序隔離到一個獨立的網絡命名空間

PID Namespaces:進程命名空間,用於隔離進程的運行信息

主要針對系統信號量,消息隊列以及共享內存;但是需要注意的是,IPC對於需要進行進程之間通信的程序,只能與同一個命名空間進行通信,無法做到不同命名空間進行信息交換通信;

Network Namespaces:網絡命名空間,用於隔離網絡配置和訪問

進程是程序運行最直接的體現方式,要實現進程隔離,將進程信息進行隔離是必須的,爲了最大的節約轉換的損耗,每一個運行在Namespaces中的進程,其實就真是的運行在Linux系統中,我們雖然可以在宿主機中找到Namespaces隔離的進程信息,但是namespaces中的PID與宿主機系統中你那個的進程PID並不相同,這也就是得益於PIDNamespaces實現的進程信息的隔離,PID Namespaces爲命名空間設置了一個獨立的進程管理棧,其中就包括了獨立的進程號管理,每個運行在Namespaces中的進程,會分配到一個屬於這個命名空間

User Namespace:用於隔離用戶和用戶組信息

通過專門的用戶隔離機制,防止運行在Namespaces中的程序直接操作宿主機系統中的用戶,以避免影響其他Namespaces中的運行程序;

有了以上 6 種 NameSpaces 從進程、網絡、IPC、文件系統、UTS和用戶角度的隔離,一個 container 就可以對外展現出一個獨立計算機的能力,並且不同 container 從 OS 層面實現了隔離。

然而不同 namespace 之間資源還是相互競爭的,仍然需要類似ulimit來管理每個 container 所能使用的資源 - -cgroup。

cgroups(Control groups)實現了對資源的配額和度量

其作用於是記錄,限制,隔離進程所使用的CPU,內存,文件IO等計算機資源;

資源限制(Resource Limitation)

cgroups 可以對進程組使用的資源總額進行限制。如設定應用運行時使用內存的上限,一旦超過這個配額就發出 OOM(Out of Memory)。

優先級分配(Prioritization)

通過分配的 CPU 時間片數量及硬盤 IO 帶寬大小,實際上就相當於控制了進程運行的優先級。

資源統計(Accounting)

cgroups 可以統計系統的資源使用量,如 CPU 使用時長、內存用量等等,這個功能非常適用於計費。

進程控制(Control)

cgroups 可以對進程組執行掛起、恢復等操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章