面向系統管理員的容器手冊
現在人們嚴重過度使用了「容器」這個術語。另外,對不同的人來說,它可能會有不同的含義,這取決於上下文。
傳統的 Linux 容器只是系統上普通的進程。一組進程與另外一組進程是相互隔離的,實現方法包括:資源限制(控制組 [cgoups])、Linux 安全限制(文件許可權,基於 Capability 的安全模塊、SELinux、AppArmor、seccomp 等)還有名字空間(進程 ID、網路、掛載等)。
如果你啟動一台現代 Linux 操作系統,使用 cat /proc/PID/cgroup
命令就可以看到該進程是屬於一個控制組的。還可以從 /proc/PID/status
文件中查看進程的 Capability 信息,從 /proc/self/attr/current
文件中查看進程的 SELinux 標籤信息,從 /proc/PID/ns
目錄下的文件查看進程所屬的名字空間。因此,如果把容器定義為帶有資源限制、Linux 安全限制和名字空間的進程,那麼按照這個定義,Linux 操作系統上的每一個進程都在一個容器里。因此我們常說 Linux 就是容器,容器就是 Linux。而容器運行時是這樣一種工具,它調整上述資源限制、安全限制和名字空間,並啟動容器。
Docker 引入了容器鏡像的概念,鏡像是一個普通的 TAR 包文件,包含了:
- rootfs(容器的根文件系統):一個目錄,看起來像是操作系統的普通根目錄(
/
),例如,一個包含/usr
,/var
,/home
等的目錄。 - JSON 文件(容器的配置):定義了如何運行 rootfs;例如,當容器啟動的時候要在 rootfs 里運行什麼命令(
CMD
)或者入口(ENTRYPOINT
),給容器定義什麼樣的環境變數(ENV
),容器的工作目錄(WORKDIR
)是哪個,以及其他一些設置。
Docker 把 rootfs 和 JSON 配置文件打包成基礎鏡像。你可以在這個基礎之上,給 rootfs 安裝更多東西,創建新的 JSON 配置文件,然後把相對於原始鏡像的不同內容打包到新的鏡像。這種方法創建出來的是分層的鏡像。
開放容器計劃 (OCI)標準組織最終把容器鏡像的格式標準化了,也就是 鏡像規範 (OCI)。
用來創建容器鏡像的工具被稱為容器鏡像構建器。有時候容器引擎做這件事情,不過可以用一些獨立的工具來構建容器鏡像。
Docker 把這些容器鏡像(tar 包)託管到 web 服務中,並開發了一種協議來支持從 web 拉取鏡像,這個 web 服務就叫 容器倉庫 。
容器引擎是能從鏡像倉庫拉取鏡像並裝載到容器存儲上的程序。容器引擎還能啟動容器運行時(見下圖)。
容器存儲一般是 寫入時複製 (COW)的分層文件系統。從容器倉庫拉取一個鏡像時,其中的 rootfs 首先被解壓到磁碟。如果這個鏡像是多層的,那麼每一層都會被下載到 COW 文件系統的不同分層。 COW 文件系統保證了鏡像的每一層獨立存儲,這最大化了多個分層鏡像之間的文件共享程度。容器引擎通常支持多種容器存儲類型,包括 overlay
、devicemapper
、btrfs
、aufs
和 zfs
。
容器引擎將容器鏡像下載到容器存儲中之後,需要創建一份容器運行時配置,這份配置是用戶/調用者的輸入和鏡像配置的合併。例如,容器的調用者可能會調整安全設置,添加額外的環境變數或者掛載一些卷到容器中。
容器運行時配置的格式,和解壓出來的 rootfs 也都被開放容器計劃 OCI 標準組織做了標準化,稱為 OCI 運行時規範。
最終,容器引擎啟動了一個容器運行時來讀取運行時配置,修改 Linux 控制組、安全限制和名字空間,並執行容器命令來創建容器的 PID 1 進程。至此,容器引擎已經可以把容器的標準輸入/標準輸出轉給調用方,並控制容器了(例如,stop
、start
、attach
)。
值得一提的是,現在出現了很多新的容器運行時,它們使用 Linux 的不同特性來隔離容器。可以使用 KVM 技術來隔離容器(想想迷你虛擬機),或者使用其他虛擬機監視器策略(例如攔截所有從容器內的進程發起的系統調用)。既然我們有了標準的運行時規範,這些工具都能被相同的容器引擎來啟動。即使在 Windows 系統下,也可以使用 OCI 運行時規範來啟動 Windows 容器。
容器編排器是一個更高層次的概念。它是在多個不同的節點上協調容器執行的工具。容器編排工具通過和容器引擎的通信來管理容器。編排器控制容器引擎做容器的啟動和容器間的網路連接,它能夠監控容器,在負載變高的時候進行容器擴容。
via: https://opensource.com/article/18/8/sysadmins-guide-containers
作者:Daniel J Walsh 選題:lujun9972 譯者:belitex 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive