Docker技術底層架構剖析

2022-04-10 15:58:01 字數 4245 閱讀 7522

[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:

#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: version

Docker架構和底層技術簡介

開篇 docker engine包含的東西有 後台程序 dockerd rest api server cli 介面 dockerd docker的架構是c s架構,docker的client和server即 dockerd 之間通過rest api server進行通訊。dockerd主要是維護後...

Docker底層架構之命名空間

命名空間是 linux 核心乙個強大的特性。每個容器都有自己單獨的命名空間,執行在其中的 應用都像是在獨立的作業系統中執行一樣。命名空間保證了容器之間彼此互不影響。相應的命名空間功能如下 不同使用者的程序就是通過 pid 命名空間隔離開的,且不同命名空間中可以有相同 pid。所有的 lxc 程序在 ...

Docker 架構優缺點大剖析

在docker問世後,其打包應用程式 快速部署的能耐,受到開發者的廣大歡迎。在2015年,docker進一步推出私有儲存庫功能docker registry,以及原生網路功能docker networking,讓企業更容易自行架構docker集群。這些都讓docker逐漸成為正式環境的新選擇。在do...