Docker技術底層架構剖析


[Docker  底層技術]

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

在操作系統中,網絡配置,進程,用戶,IPC(進程之間的調用)等信息之間的操作,都是可以被所有進程查看到的,除了這些資源信息,我們還需要隔離進程之間能夠共享的信息,而Namespaces用於實現進程之間信息隔離的

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

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

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

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

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

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

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

 有了以上 6 種 NameSpaces 從進程、網絡、IPC、文件系統、UTS和用戶角度的隔離,一個 container 就可以對外展現出一個獨立計算機的能力,並且不同 container 從 OS 層面實現了隔離。然而不同 namespace 之間資源還是相互競爭的,仍然需要類似ulimit來管理每個 container 所能使用的資源 - -cgroup。

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

【控制組】

關於Linux控制組也就是Cgroups(控制組群),其作用於是記錄,限制,隔離進程所使用的CPU,內存,文件IO等計算機資源;

cgroups通過插入程序對計算機硬件 資源調用的過程,實現了控制進程使用資源目的,作為 容器的兩大關鍵技術,Namespaces主要實現了進程信息,用戶,掛載目錄,網絡配置等軟件資源的隔離,
而Cgroups實現呃對CPU,內存,文件IO等硬件資源的控制; PS:通過Namespaces來實現不同容器中進程之間隔離,相互之間不能訪問,但是如果缺少cgroups對硬件資源的控制,就是避免不了容器中的程序對資源搶占,從而影響其他容器中程序的運行
Cgroups的組成 從功能層面來說: #Resource Limiting:資源限制。Cgroups能夠成為每一個控制組設置使用資源的上限,一旦此類控制分配的資源達到了上線,既不會再分配過多的資源給這個控制組 #Prioritization:優先級分配,Cgroups可以為不同的控制組設置不同的優先級,優先級較高的控制組,可以優先得到Cgroups為其分配的計算機資源 #Accounting:資源統計。對於每個控制組,cgroups都能掌握它們對資源的使用情況,如CPU的使用時長,內存消耗,句柄數等 #Control:進程控制,Cgroups還能對控制組中的進程進行掛起,恢復等操作 Cgroups以下幾個重要的組成結構 Task:任務。分配計算機資源就是為了執行特定的任務, Cgroup:控制組,由任務組成的任務組成為控制組,在cgroups中,控制組是分配和控制資源分配的單位 Subsystem:子系統,也就是資源調度的控制器。 Hierachy:繼承樹,用於處理控制組和子系統的關系。能夠將控制組制成樹狀關系,並讓子系統依附到對應的內存子系統中

  【容器與控制組】

CGroup主要能夠從blikio(塊設備IO控制)cpu(CPU使用限制),cpuacct(CPU資源報告),cpuset(多核CPU核心使用控制),devices(設備訪問控制),freezer(進程掛起控制),memory(內存使用控制),net_cls(網絡控制)和ns(名稱空間子系統)等方面限制計算機資源的使用

【聯合文件系統】

UFS是聯合文件系統的簡稱,所謂的聯合文件系統,就是能夠多個目錄掛載成同一個文件系統換句話說就是將多個目錄掛載成同一個目錄,主要特點就是能夠從不同的文件系統里將文件掛載到虛擬的聯合文件 系統中,還能夠把多個目錄掛載合並成同一個目錄

 Docker利用UFS實現鏡像技術,,是docker容器技術夠被廣泛使用的一個殺手鐧。UFS制成的鏡像大幅度縮小了占用空間,並且能夠以分拆的方式在鏡像之間共享數據。特別是對於鏡像的更新,docker能夠在不修改原有的鏡像同時,以最小的空間消耗對存儲文件的修改

【Docker Engine架構】

我們把docker Engine中所包含的提供doker容器支持的服務程序被dockr daemon。把能夠操作docker Engine的客戶端成為docker CLI。

docker daemon與docker cli之間是通過docker API進行通信的,也就是說,通過 Docker CLI下達指令,Docker CLI轉換為對應的Docker API后,被提交到docker daemon;其實他們兩者的關系是非常松散的,不相互依存。Docker CLI既可以直接通過 進程間的通信方式與本機的Docker Daemon連接。也可以通過socket向其他機器上的docker daemon下達操作指令,甚至能夠同時操作多個docker daemon;

#Docker Daemon:是實現docker核心程序,管理包括鏡像,容器,網絡,數據卷 等在內的所有docker組成的模塊;docker daemon使用的是linux進程通信接口,且只允許本地的根用戶訪問。所以需要在root環境操作,執行docker cli提供的docker命令,如果想讓docker daemon監聽選定的網絡地址。可以通過dockerd命令,配合-H或者--host參數,給出監聽的網絡地址

dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:9876

#Docker CLI其實就是在終端命令行中使用的docker程序,能夠將下達的命令行指令轉換為docker API請求,在發送到與之關聯的docker daemon中

docker CLI工作流程:

每個操作指令與docker daemon相關,首先docker CLI根據指令的類型轉換為對應的docker API請求,然后docker CLI請求與之關聯的docker Daemon並等待處理結果,docker daemon收到請求操作指令之后,會根據指令內容進行操作,並將結果返回給docekr CLI,docker CLI收到docker daemon返回結果后,會解析結果中的數據,並打印到終端上;

dockerd -H tcp://127.0.0.1:9876 version


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM