1. 程式人生 > >系統管理員的容器指南

系統管理員的容器指南

“容器”這一術語被嚴重過度使用。實際上,根據具體情況,它可能對不同的人意味著不同的東西。

傳統的Linux容器實際上只是Linux系統上的普通程序。這些程序組使用資源約束(控制組[cgroups])、Linux安全約束(Unix許可權、功能、SELinux、AppArmor、seccomp等)和名稱空間(PID、網路、裝載等)與其他程序組隔離。

如果你啟動一個現代Linux系統並用cat / proc / PID / cgroup檢視任何程序,你會看到該程序位於cgroup中。如果檢視/ proc / PID / status,會看到功能。如果檢視/ proc / self / attr / current,會看到SELinux標籤。如果檢視/ proc / PID / ns,會看到程序所在的名稱空間列表。因此,如果你將容器定義為具有資源約束、Linux安全約束和名稱空間的程序,那麼根據定義,Linux上的每個程序都在一個容器中。這就是為什麼我們經常說Linux是容器,容器是Linux。容器執行時是修改這些資源約束、安全性和名稱空間並啟動容器的工具。

Docker引入了容器映象的概念。這是一個標準的TAR檔案,它結合了:

——Rootfs(容器根檔案系統):系統上看起來像作業系統的標準根(/)的目錄。例如,帶有/ usr,/ var,/ home等的目錄。

—— JSON檔案(容器配置):指定如何執行rootfs。例如,容器啟動時在rootfs中執行的命令或入口點,為容器設定的環境變數,容器的工作目錄,和一些其他設定。

Docker“tar up”rootfs和JSON檔案來建立基本映象。這使你可以在rootfs上安裝其他內容,建立新的JSON檔案,並使用更新的JSON檔案來tar原始映象與新映象之間的差異。這會建立一個分層影象。

容器映象的定義最終由Open Container Initiative(OCI)標準體標準化為OCI Image Specification。

用於建立容器映象的工具稱為容器映象構建器。有時容器引擎執行此任務,也可以使用一些獨立工具來構建容器映象。

Docker採用了這些容器映象(tarball)並將它們移動到一個Web服務(從中可以提取它們),開發了一個協議來提取它們,並將該Web服務稱為容器登錄檔。

容器引擎是可以從容器登錄檔中提取容器映象並將它們重新組裝到容器儲存上的程式。容器引擎也啟動容器執行時。

 

 

容器儲存通常是寫時複製(COW)分層檔案系統。從容器登錄檔中提取容器映象時,首先需要解壓rootfs並將其放在磁碟上。如果你有多個構成映象的層,則會下載每個層並將其儲存在COW檔案系統的不同層上。COW檔案系統允許每個層單獨儲存,這最大化了分層映象的共享。容器引擎通常支援多種型別的容器儲存,包括overlay、devicemapper、btrfs、aufs和zfs。

在容器引擎將容器映象下載到容器儲存之後,它需要建立容器執行時配置。執行時配置結合來自呼叫者/使用者的輸入以及容器映象規範的內容。例如,呼叫者可能希望指定對正在執行的容器的安全性的修改,新增其他環境變數或將卷裝入容器。

OCI標準組織還將容器執行時配置和rootfs佈局標準化為OCI Runtime Specification。

最後,容器引擎啟動一個讀取容器執行時規範的容器執行時,修改Linux cgroups、Linux安全性約束和名稱空間,並啟動容器命令以建立容器的PID 1。此時,容器引擎可以將stdin / stdout中繼回撥用者並控制容器(如停止、啟動、掛載)。

請注意,正在引入許多新的容器執行時以使用Linux的不同部分來隔離容器。人們現在可以使用KVM分離(比如迷你虛擬機器)執行容器,或者可以使用其他虛擬機器管理程式策略(例如攔截來自容器中程序的所有系統呼叫)。由於我們有一個標準的執行時規範,這些工具都可以由相同的容器引擎啟動。甚至Windows也可以使用OCI Runtime Specification來啟動Windows容器。

更高層次的是容器編排器。容器編排器是用於協調多個不同節點上的容器執行的工具。容器編排器與容器引擎通訊以管理容器。編排器告訴容器引擎啟動容器並將它們的網路連線在一起。編排器可以監控容器並在負載增加時啟動其他容器。