關(guān)于容器和容器運(yùn)行時(shí)的那些事
容器技術(shù)是一種虛擬化技術(shù),也就是我們常常說的“軟件定義XXX”。在容器之前被廣泛應(yīng)用的是虛擬機(jī)技術(shù),也就是軟件定義的硬件。代表產(chǎn)品就是VMWare。我早年在EMC工作的時(shí)候,公司常常提起收購(gòu)VMWare是多么多么英明的一項(xiàng)決策,那個(gè)時(shí)候虛擬機(jī)技術(shù)真的很火。例如軟件模擬硬件,用戶可以很方便的在自己的主機(jī)上運(yùn)行不用的硬件和操作系統(tǒng),并且可以方便的把整個(gè)系統(tǒng)的快照作為文件遷移,真的非常方便。
但是虛擬機(jī)需要模擬整個(gè)的硬件,它的開銷是非常大的。內(nèi)存,CPU和磁盤空間都是獨(dú)占的。在系統(tǒng)架構(gòu)的層面,虛擬機(jī)技術(shù)仍然非常有用,但是對(duì)日常的開發(fā)工作來說,虛擬機(jī)技術(shù)就太重了。
從軟件開發(fā)和部署的角度來看,我們希望有一個(gè)這樣的虛擬化技術(shù):
- 能夠隔離CPU,內(nèi)存,磁盤,網(wǎng)絡(luò)等資源
- 能夠控制資源使用的量和優(yōu)先級(jí)
- 能夠運(yùn)行獨(dú)立的操作系統(tǒng)
- 比較輕量級(jí)的系統(tǒng)開銷
- 比較方便的管理功能
在Unix/Linux世界,我們第一個(gè)想到的類似的東西是Chroot。
1.Chroot
Chroot是在Unix系統(tǒng)的一個(gè)操作,即 change root directory (更改 root 目錄)。在 Linux 系統(tǒng)中,系統(tǒng)默認(rèn)的目錄結(jié)構(gòu)都是以 `/`,即是以根 (root) 開始的。而在使用 chroot 之后,系統(tǒng)的目錄結(jié)構(gòu)將以指定的位置作為 `/` 位置。由Chroot創(chuàng)造出的那個(gè)根目錄,叫做“chroot jail”(chroot jail,或chroot prison)。
只有root用戶可以執(zhí)行chroot。大多數(shù)Unix系統(tǒng)都沒有以完全文件系統(tǒng)為導(dǎo)向,以及可能通過網(wǎng)絡(luò)和過程控制,通過系統(tǒng)調(diào)用接口來提供一個(gè)破壞chroot的程序。
在經(jīng)過chroot 之后,系統(tǒng)讀取到的目錄和文件將不在是舊系統(tǒng)根下的而是新根下(即被指定的新的位置)的目錄結(jié)構(gòu)和文件,因此它帶來的好處大致有以下3個(gè):
- 增加了系統(tǒng)的安全性,限制了用戶的權(quán)力;在經(jīng)過 chroot 之后,在新根下將訪問不到舊系統(tǒng)的根目錄結(jié)構(gòu)和文件,這樣就增強(qiáng)了系統(tǒng)的安全性。這個(gè)一般是在登錄 (login) 前使用 chroot,以此達(dá)到用戶不能訪問一些特定的文件。
- 建立一個(gè)與原系統(tǒng)隔離的系統(tǒng)目錄結(jié)構(gòu),方便用戶的開發(fā);使用 chroot 后,系統(tǒng)讀取的是新根下的目錄和文件,這是一個(gè)與原系統(tǒng)根下文件不相關(guān)的目錄結(jié)構(gòu)。在這個(gè)新的環(huán)境中,可以用來測(cè)試軟件的靜態(tài)編譯以及一些與系統(tǒng)不相關(guān)的獨(dú)立開發(fā)。
- 切換系統(tǒng)的根目錄位置,引導(dǎo) Linux 系統(tǒng)啟動(dòng)以及急救系統(tǒng)等。chroot 的作用就是切換系統(tǒng)的根位置,而這個(gè)作用最為明顯的是在系統(tǒng)初始引導(dǎo)磁盤的處理過程中使用,從初始 RAM 磁盤 (initrd) 切換系統(tǒng)的根位置并執(zhí)行真正的 init。另外,當(dāng)系統(tǒng)出現(xiàn)一些問題時(shí),我們也可以使用 chroot 來切換到一個(gè)臨時(shí)的系統(tǒng)。
但是Chroot并不能滿足我們之前提到的哪些需求,chroot的隔離功能非常有限,chroot的機(jī)制本身不是為限制資源的使用而設(shè)計(jì),如I/O,帶寬,磁盤空間或CPU時(shí)間。
為了實(shí)現(xiàn)我們之前提到的那些需求,我們需要一種更為強(qiáng)大的虛擬化技術(shù),容器也就隨之發(fā)展起來。
2.容器VS.虛機(jī)
Linux的容器和虛擬機(jī)的差比我想大家都比較了解了,我這里再簡(jiǎn)單敘述一下:
對(duì)于使用虛擬機(jī)的傳統(tǒng)虛擬化,每個(gè)虛擬機(jī)都有自己的完整操作系統(tǒng),因此在運(yùn)行內(nèi)置于虛擬機(jī)的應(yīng)用程序時(shí),內(nèi)存使用量可能會(huì)高于必要值,虛擬機(jī)可能會(huì)開始耗盡主機(jī)所需的資源。容器共享操作系統(tǒng)環(huán)境(內(nèi)核),因此它們比完整虛擬機(jī)使用更少的資源,并減輕主機(jī)內(nèi)存的壓力。
傳統(tǒng)虛擬機(jī)可占用大量磁盤空間:除了虛擬機(jī)托管的任何應(yīng)用程序外,它們還包含完整的操作系統(tǒng)和相關(guān)工具。
容器相對(duì)較輕:它們僅包含使容器化應(yīng)用程序運(yùn)行所需的庫(kù)和工具,因此它們比虛擬機(jī)更緊湊,并且啟動(dòng)速度更快。
在更新或修補(bǔ)操作系統(tǒng)時(shí),必須逐個(gè)更新傳統(tǒng)計(jì)算機(jī):必須單獨(dú)修補(bǔ)每個(gè)客戶操作系統(tǒng)。對(duì)于容器,只需更新容器主機(jī)(托管容器的機(jī)器)的操作系統(tǒng)。這顯著簡(jiǎn)化了維護(hù)。
利用這些優(yōu)勢(shì)容器在軟件開發(fā)領(lǐng)域里迅速發(fā)展,我已經(jīng)很習(xí)慣用容器去安裝各種軟件應(yīng)用,因?yàn)樗_銷很小,而且隔離性很好,我可以很方便的使用同一個(gè)軟件的多個(gè)版本而不用擔(dān)心沖突問題。
Linux的容器技術(shù)是如何做到這些的呢?我們來看看構(gòu)建容器技術(shù)的兩個(gè)核心功能命名空間Namespace和控制組CGroup。
3.命名空間Namespace
命名空間是Linux內(nèi)核的一項(xiàng)功能,該功能對(duì)內(nèi)核資源進(jìn)行分區(qū)。控制進(jìn)程可以訪問的資源,以使一組進(jìn)程看到一組資源,而另一組進(jìn)程看到另一組資源。資源可能存在于多個(gè)空間中。Linux系統(tǒng)以每種類型的單個(gè)名稱空間開始,供所有進(jìn)程使用。進(jìn)程可以創(chuàng)建其他名稱空間,并加入不同的名稱空間。
Linux下常見的命名空間有:
- 掛載Mount mnt
- 進(jìn)程Id pid
- 網(wǎng)絡(luò) net
- 進(jìn)程間通信 ipc
- 用戶Id user
- UTS
簡(jiǎn)單的講,利用Namespace可以實(shí)現(xiàn)我們想要的資源隔離,控制哪些資源可以使用。
4.控制組CGroup
CGroup 是 Control Groups 的縮寫,是 Linux 內(nèi)核提供的一種可以限制、記錄、隔離進(jìn)程組 (process groups) 所使用的物理資源 (如 cpu memory i/o 等等) 的機(jī)制。2007 年進(jìn)入 Linux 2.6.24 內(nèi)核,CGroups 不是全新創(chuàng)造的,它將進(jìn)程管理從 cpuset 中剝離出來,作者是 Google 的 Paul Menage。CGroups 也是 LXC 為實(shí)現(xiàn)虛擬化所使用的資源管理手段。
CGroup 是將任意進(jìn)程進(jìn)行分組化管理的 Linux 內(nèi)核功能。CGroup 本身是提供將進(jìn)程進(jìn)行分組化管理的功能和接口的基礎(chǔ)結(jié)構(gòu),I/O 或內(nèi)存的分配控制等具體的資源管理功能是通過這個(gè)功能來實(shí)現(xiàn)的。這些具體的資源管理功能稱為 CGroup 子系統(tǒng)或控制器。CGroup 子系統(tǒng)有控制內(nèi)存的 Memory 控制器、控制進(jìn)程調(diào)度的 CPU 控制器等。運(yùn)行中的內(nèi)核可以使用的 Cgroup 子系統(tǒng)由/proc/cgroup 來確認(rèn)。
CGroup的主要功能:
- 資源限制,可以將組設(shè)置為不超過配置的內(nèi)存限制,其中還包括文件系統(tǒng)緩存[8] [9]
- 優(yōu)先次序,一些組可能會(huì)在CPU利用率或磁盤I / O吞吐量中獲得更大份額。
- 會(huì)計(jì),衡量組的資源使用情況,例如可用于計(jì)費(fèi)目的
- 控制,凍結(jié)進(jìn)程組,記錄檢查點(diǎn)并重新啟動(dòng)
CGroup常見的子系統(tǒng)包括:
- blkio 對(duì)塊設(shè)備(比如硬盤)的IO進(jìn)行訪問限制
- cpu 設(shè)置進(jìn)程的CPU調(diào)度的策略,比如CPU時(shí)間片的分配
- memory 用于控制cgroup中進(jìn)程的占用以及生成內(nèi)存占用報(bào)告
- net_cls 使用等級(jí)識(shí)別符(classid)標(biāo)記網(wǎng)絡(luò)數(shù)據(jù)包,這讓 Linux 流量控制器 tc (traffic controller) 可以識(shí)別來自特定 cgroup 的包并做限流或監(jiān)控
- net_prio 設(shè)置cgroup中進(jìn)程產(chǎn)生的網(wǎng)絡(luò)流量的優(yōu)先級(jí)
- hugetlb 限制使用的內(nèi)存頁(yè)數(shù)量
- pids 限制任務(wù)的數(shù)量
- ns 可以使不同cgroups下面的進(jìn)程使用不同的namespace.
每個(gè)subsystem會(huì)關(guān)聯(lián)到定義的cgroup上,并對(duì)這個(gè)cgroup中的進(jìn)程做相應(yīng)的限制和控制.
簡(jiǎn)單的講,利用CGroup,可以控制能使用的資源的量。
有了Namespace和CGroup這兩個(gè)特性,容器做到了控制資源隔離和訪問的量。但是我們還是需要方便的管理功能和接口,Docker在容器的基本功能的基礎(chǔ)上提供了出色的管理功能和接口,成為了容器領(lǐng)域里的事實(shí)標(biāo)準(zhǔn),我們一般說容器,默認(rèn)的是用Docker的技術(shù)。
5.Docker
Docker 是一個(gè)開放源代碼軟件,是一個(gè)開放平臺(tái),用于開發(fā)應(yīng)用、交付應(yīng)用、運(yùn)行應(yīng)用。Docker允許用戶將基礎(chǔ)設(shè)施中的應(yīng)用單獨(dú)分割出來,形成更小的顆粒,從而提高交付軟件的速度。Docker容器與虛擬機(jī)類似,但原理上,容器是將操作系統(tǒng)層虛擬化,虛擬機(jī)則是虛擬化硬件,因此容器更具有便攜性、高效地利用服務(wù)器。
Docker的主要特性有:
- 分層容器
Docker使用AUFS / devicemapper / btrfs使用文件系統(tǒng)的只讀層來構(gòu)建容器。容器由只讀層組成,這些只讀層在提交后將成為容器映像。鏡像是一個(gè)包含用于構(gòu)建應(yīng)用程序的圖層的容器。當(dāng)docker容器運(yùn)行時(shí),只有頂層是可讀寫的,下面的所有層都是只讀的,頂層是臨時(shí)數(shù)據(jù),直到將其提交到新層為止。使用只讀文件系統(tǒng)的覆蓋層會(huì)帶來固有的復(fù)雜性和性能損失。
- 單一應(yīng)用容器
Docker將容器限制為僅一個(gè)進(jìn)程。默認(rèn)的docker baseimage OS模板并非旨在支持多個(gè)應(yīng)用程序,進(jìn)程或服務(wù),如init,cron,syslog,ssh等。您可以想象這會(huì)引入一定的復(fù)雜性,并且對(duì)日常使用場(chǎng)景具有巨大的影響。由于當(dāng)前的體系結(jié)構(gòu),應(yīng)用程序和服務(wù)旨在在正常的多進(jìn)程OS環(huán)境中運(yùn)行,因此您需要找到一種Docker方式來做事或使用支持Docker的工具。對(duì)于LAMP容器的應(yīng)用程序,需要構(gòu)建3個(gè)相互使用服務(wù)的容器,一個(gè)PHP容器,一個(gè)Apache容器和一個(gè)MySQL容器。能在一個(gè)容器中建造所有3個(gè)容器嗎?可以,但無法在同一容器中運(yùn)行php-fpm,apache和mysqld,也無法安裝單獨(dú)的進(jìn)程管理器(如runit或supervisor)。
- 狀態(tài)分離
Docker將容器存儲(chǔ)與應(yīng)用程序分開,可以在數(shù)據(jù)卷容器中將持久性數(shù)據(jù)安裝在主機(jī)中的容器外部。除非用例只是具有非持久性數(shù)據(jù)的容器,否則有可能使Docker容器的可移植性降低。這也是容器編排更容易支持無狀態(tài)應(yīng)用的根本原因。
- 鏡像注冊(cè)
Docker提供了一個(gè)公共和私有鏡像注冊(cè),用戶可以在其中推送和提取鏡像。鏡像用于組成應(yīng)用程序的只讀層。這使用戶可以輕松共享和分發(fā)應(yīng)用程序。
上圖是Docker的架構(gòu)圖,我們看到Docker是如何提供容器的管理功能的。
- Docker 守護(hù)進(jìn)程負(fù)責(zé)容器聲明周期的管理
- Registry 提供容器鏡像倉(cāng)庫(kù)的功能
- Docker 守護(hù)進(jìn)程負(fù)責(zé)從鏡像倉(cāng)庫(kù)推/拉取容器的鏡像
- 客戶端程序負(fù)責(zé)和守護(hù)進(jìn)程通信,發(fā)送相關(guān)的容器管理的命令
在Docker 1.11版之前,Docker Engine守護(hù)進(jìn)程下載容器映像,啟動(dòng)容器進(jìn)程,公開遠(yuǎn)程API并充當(dāng)日志收集守護(hù)進(jìn)程,所有這些都以集中化進(jìn)程的身份以root身份運(yùn)行。盡管這樣的集中式體系結(jié)構(gòu)便于部署,但是它沒有遵循Unix進(jìn)程和特權(quán)分離的優(yōu)秀實(shí)踐;此外,這使得Docker難以與Linux初始系統(tǒng)(如upstart和systemd)正確集成。
如下圖所示,從1.11版開始,Docker守護(hù)程序不再處理容器本身的執(zhí)行。而是現(xiàn)在由containerd處理。更準(zhǔn)確地說,Docker守護(hù)程序?qū)⒂诚駵?zhǔn)備為開放容器鏡像(OCI)捆綁包,并對(duì)容器進(jìn)行API調(diào)用以啟動(dòng)OCI捆綁包。然后使用runC啟動(dòng)容器化容器。
那么ContainerD和RunC又分別是神馬東東呢?我們繼續(xù)探索。
6.ContainerD
Containerd是行業(yè)標(biāo)準(zhǔn)的容器運(yùn)行時(shí),重點(diǎn)是簡(jiǎn)單性,健壯性和可移植性。containerd可用作Linux和Windows的守護(hù)程序。它管理著主機(jī)系統(tǒng)的容器的整個(gè)生命周期,從鏡像傳輸和存儲(chǔ)到容器執(zhí)行和監(jiān)督,再到低級(jí)存儲(chǔ)再到網(wǎng)絡(luò)附件等等。containerd旨在嵌入到更大的系統(tǒng)中,而不是由開發(fā)人員或最終用戶直接使用。
containerD是用Go語言構(gòu)建的,有興趣的可以去看它的代碼:
https://github.com/containerd/containerd
7.RunC
RunC是一個(gè)輕量級(jí)的工具,它是用來運(yùn)行容器的,只用來做這一件事,并且這一件事要做好。我們可以認(rèn)為它就是個(gè)命令行小工具,可以不用通過 docker 引擎,直接運(yùn)行容器。事實(shí)上,runC 是標(biāo)準(zhǔn)化的產(chǎn)物,它根據(jù) OCI 標(biāo)準(zhǔn)來創(chuàng)建和運(yùn)行容器。而 OCI(Open Container Initiative)組織,旨在圍繞容器格式和運(yùn)行時(shí)制定一個(gè)開放的工業(yè)化標(biāo)準(zhǔn)。
RunC支持一普通用戶的身份運(yùn)行容器。
RunC支持容器的熱遷移操作,所謂熱遷移就是將一個(gè)容器進(jìn)行 checkpoint 操作,并獲得一系列文件,使用這一系列文件可以在本機(jī)或者其他主機(jī)上進(jìn)行容器的 restore 工作。這也是 checkpoint 和 restore 兩個(gè)命令存在的原因。熱遷移屬于比較復(fù)雜的操作,目前 runC 使用了 CRIU 作為熱遷移的工具。RunC 主要是調(diào)用 CRIU(Checkpoint and Restore in Userspace)來完成熱遷移操作。CIRU 負(fù)責(zé)凍結(jié)進(jìn)程,并將作為一系列文件存儲(chǔ)在硬盤上。并負(fù)責(zé)使用這些文件還原這個(gè)被凍結(jié)的進(jìn)程。
上圖顯示了不同的容器技術(shù)是如何使用RunC的,可以看到,Docker/Podman/CRI-O都使用了RunC。那么我們看看除了Docker,現(xiàn)在還有哪些容器的運(yùn)行時(shí)呢?
8.CRI-O
CRI-O是Kubernetes的輕量級(jí)容器運(yùn)行時(shí),這就是CRI-O提供的。該名稱源于CRI(Container Runtime Interface)加開放容器倡議(OCI open container initiative ),因?yàn)镃RI-O嚴(yán)格關(guān)注符合OCI的運(yùn)行時(shí)和容器映像。CRI-O的范圍是與Kubernetes一起使用,以管理和運(yùn)行OCI容器。盡管該項(xiàng)目確實(shí)具有一些用于故障排除的面向用戶的工具,但它并不是面向開發(fā)人員的工具。
上圖是CRI-O的架構(gòu)。
簡(jiǎn)而言之,CRI-O是用于Kubernetes內(nèi)部的容器運(yùn)行時(shí)接口的標(biāo)準(zhǔn)。它的出現(xiàn)我的理解是K8s(google)為了擺脫docker的束縛,走向開放平臺(tái)的一步棋。可以看到,Docker作為一個(gè)成功的技術(shù)產(chǎn)品,它在商業(yè)上卻似乎不是那么成功,k8s如果完成對(duì)docker的解耦,docker的前景似乎不太妙。
9.Podman
守護(hù)進(jìn)程是人們對(duì)Docker架構(gòu)的主要詬病,它帶來了很多管理和安全上的問題。
Podman是一個(gè)無守護(hù)進(jìn)程的容器引擎,用于在Linux系統(tǒng)上開發(fā),管理和運(yùn)行OCI容器。容器可以以root用戶或普通用戶的模式運(yùn)行。
Podman管理容器使用傳統(tǒng)的fork / exec模型,因此容器進(jìn)程是Podman進(jìn)程的后代。Docker使用客戶端/服務(wù)器模型。執(zhí)行的docker命令是Docker客戶端工具,它通過客戶端/服務(wù)器操作與Docker守護(hù)進(jìn)程通信。然后,Docker守護(hù)程序創(chuàng)建容器并處理stdin / stdout與Docker客戶端工具的通信。Podman可以運(yùn)行于非root用戶模式下,而docker的守護(hù)進(jìn)程必須用root用戶啟動(dòng)。Podman的模型被認(rèn)為是更為安全的模型。同時(shí)因?yàn)槲ㄓ惺刈o(hù)進(jìn)程,你的系統(tǒng)看上去也更為干凈。
當(dāng)然Podman的問題是它還很新,管理工具和功能都很弱,你可能需要buildah來構(gòu)建鏡像,社區(qū)和生態(tài)都還很小。如果你想用Podman取代Docker,請(qǐng)謹(jǐn)慎操作。
10.LXC/LXD
LXC是Linux內(nèi)核容器功能的用戶空間接口。通過功能強(qiáng)大的API和簡(jiǎn)單的工具,它使Linux用戶可以輕松地創(chuàng)建和管理系統(tǒng)或應(yīng)用程序容器。
LXC是一個(gè)系統(tǒng)容器運(yùn)行時(shí),旨在執(zhí)行“完整的系統(tǒng)容器”,通常由完整的操作系統(tǒng)映像組成。在最常見的用例中,LXC進(jìn)程將引導(dǎo)完整的Linux發(fā)行版,如Debian,F(xiàn)edora,Arch等,并且用戶將與虛擬機(jī)映像進(jìn)行交互。LXC也可以用于運(yùn)行(但不下載)應(yīng)用程序容器,但是這種用法需要對(duì)底層操作系統(tǒng)的詳細(xì)信息有更多的了解,并且這種做法不太常見。LXC可以從各種公共鏡像下載“完整系統(tǒng)容器”映像,并以密碼方式對(duì)其進(jìn)行驗(yàn)證。LXC沒有中央守護(hù)程序,可以與instart系統(tǒng)(例如upstart和systemd)集成。
LXD與LXC相似,但它是liblxc之上的REST API,它派生了一個(gè)監(jiān)視器和容器進(jìn)程。這樣可以確保LXD守護(hù)程序不是故障的中心點(diǎn),并且在LXD守護(hù)程序發(fā)生故障的情況下容器可以繼續(xù)運(yùn)行。所有其他細(xì)節(jié)與LXC幾乎相同。簡(jiǎn)單的說LXD = LXC + RestAPI
LXC是一種容器技術(shù),可為您提供輕量級(jí)Linux容器,而Docker是基于容器的單個(gè)應(yīng)用程序虛擬化引擎。它們聽起來可能相似,但完全不同。與LXC容器不同,Docker容器的行為不像輕量級(jí)VM,因此不能被視為輕量級(jí)VM。Docker容器在設(shè)計(jì)上僅限于單個(gè)應(yīng)用程序。你可以登錄到LXC容器,將其像OS一樣對(duì)待,然后安裝您的應(yīng)用程序和服務(wù),它將按預(yù)期運(yùn)行。您無法在Docker容器中做到這一點(diǎn)。Docker基礎(chǔ)OS模板被簡(jiǎn)化為單個(gè)應(yīng)用程序環(huán)境,并且沒有適當(dāng)?shù)某跏蓟蛑С种T如服務(wù),守護(hù)程序,syslog,cron或運(yùn)行多個(gè)應(yīng)用程序之類的東西。
11.rkt
rkt是為現(xiàn)代生產(chǎn)云原生環(huán)境開發(fā)的應(yīng)用程序容器引擎。它具有pod-native方法,可插入執(zhí)行環(huán)境以及定義明確的表面積,使其非常適合與其他系統(tǒng)集成。
rkt的核心執(zhí)行單元是Pod,它是在共享上下文中執(zhí)行的一個(gè)或多個(gè)應(yīng)用程序的集合(rkt的Pod與Kubernetes編排系統(tǒng)中的概念同義)。rkt允許用戶在Pod級(jí)別和更細(xì)粒度的每個(gè)應(yīng)用程序級(jí)別應(yīng)用不同的配置(例如隔離參數(shù))。rkt的體系結(jié)構(gòu)意味著在一個(gè)獨(dú)立的,獨(dú)立的環(huán)境中,每個(gè)pod都可以直接在經(jīng)典的Unix流程模型(即沒有中央守護(hù)程序)中執(zhí)行。rkt實(shí)施了現(xiàn)代,開放,標(biāo)準(zhǔn)的容器格式,即App Container(appc)規(guī)范,但還可以執(zhí)行其他容器映像,例如使用Docker創(chuàng)建的那些。
自2014年12月由CoreOS引入以來,rkt項(xiàng)目已經(jīng)非常成熟并得到了廣泛使用。它可用于大多數(shù)主要的Linux發(fā)行版,并且每個(gè)rkt發(fā)行版都會(huì)構(gòu)建供用戶安裝的獨(dú)立rpm / deb軟件包。這些軟件包還可以作為Kubernetes存儲(chǔ)庫(kù)的一部分使用,以支持rkt + Kubernetes集成的測(cè)試。rkt在Google Container Image和CoreOS Container Linux如何運(yùn)行Kubernetes方面也起著核心作用。RKT以其快速,可組合和安全的提供功能而聞名。許多用戶已經(jīng)注意到docker的安全問題,因此CoreOS必須在2014年發(fā)布RKT作為docker的競(jìng)爭(zhēng)對(duì)手,并且由于其功能(如安全性,可互操作性等)而變得流行。
類似Podman,rkt沒有集中的守護(hù)進(jìn)程,而是直接從客戶端命令啟動(dòng)容器,從而使其與系統(tǒng)初始化功能(例如systemd,upstart等)兼容。
12.Kata Container
Kata Containers 是由 OpenStack 基金會(huì)管理,但獨(dú)立于 OpenStack 項(xiàng)目之外的容器項(xiàng)目。它是一個(gè)可以使用容器鏡像以超輕量級(jí)虛機(jī)的形式創(chuàng)建容器的運(yùn)行時(shí)工具,Kata Containers 創(chuàng)建的不同容器跑在一個(gè)個(gè)不同的虛擬機(jī)(kernel)上,比起傳統(tǒng)容器提供了更好的隔離性和安全性。同時(shí)繼承了容器快速啟動(dòng)和快速部署等優(yōu)點(diǎn)。
我們之前提到了虛擬機(jī)技術(shù)因?yàn)槠溟_銷的原因,受到了一定的使用限制。Kata Container可以說是虛擬機(jī)技術(shù)的逆襲,可以多快好省的建設(shè)容器社會(huì)。
如上圖的架構(gòu)所示,Kata Containers 其實(shí)跟 RunC 類似,也是一個(gè)符合 OCI 運(yùn)行時(shí)規(guī)范的一種實(shí)現(xiàn)。不同之處是它給每個(gè) Docker 容器或每個(gè) K8S Pod 增加了一個(gè)獨(dú)立的 Linux 內(nèi)核 (不共享宿主機(jī)的內(nèi)核),使容器具有更好的隔離性、安全性。
13.其他
除了我們之前提到的,還有其他一些容器技術(shù),我們簡(jiǎn)單的看看。
- systemd-nspawn是一個(gè)容器運(yùn)行時(shí),旨在在Linux容器內(nèi)部執(zhí)行進(jìn)程。systemd-nspawn的名字來源從“從命名空間spawn”,這意味著它僅處理進(jìn)程隔離,而不執(zhí)行內(nèi)存,CPU等資源隔離。systemd-nspawn可以運(yùn)行應(yīng)用程序容器或系統(tǒng)容器,但不能單獨(dú)運(yùn)行,下載或驗(yàn)證鏡像。systemd-nspawn沒有集中的守護(hù)程序,可以與系統(tǒng)啟動(dòng)(例如upstart和systemd)集成。
- OpenVZ OpenVZ是基于Linux內(nèi)核的操作系統(tǒng)級(jí)虛擬化技術(shù)。OpenVZ允許物理服務(wù)器運(yùn)行多個(gè)操作系統(tǒng),該技術(shù)常用于虛擬專用服務(wù)器(VPS,Virtual Private Server)。OpenVZ是一種系統(tǒng)容器運(yùn)行時(shí),旨在執(zhí)行通常是完整系統(tǒng)映像的“完整系統(tǒng)容器”。在最常見的用例中,OpenVZ進(jìn)程將引導(dǎo)完整的Linux 發(fā)行版,例如Debian,F(xiàn)edora,Arch等,并且用戶將與虛擬機(jī)映像類似地與其交互。OpenVZ可以從各種公共鏡像下載“完整系統(tǒng)容器”鏡像,并以密碼方式對(duì)其進(jìn)行驗(yàn)證。OpenVZ沒有中央守護(hù)程序,可以與inup系統(tǒng)(例如upstart和systemd)集成。
- FreeBSD jail,一種操作系統(tǒng)層虛擬化技術(shù),在FreeBSD操作系統(tǒng)中運(yùn)作。利用這個(gè)技術(shù),F(xiàn)reeBSD的系統(tǒng)管理者,可以創(chuàng)造出幾個(gè)小型的軟件系統(tǒng),這些軟件系統(tǒng)被稱為jail。這個(gè)技術(shù)被Poul-Henning Kamp采納,加入FreeBSD系統(tǒng)中。
- Solaris Containers,以及Solaris Zones,一個(gè)操作系統(tǒng)層虛擬化技術(shù)的實(shí)作,由Sun開發(fā)。2004年2月,伴隨著Solaris 10 build 51 beta首次對(duì)外發(fā)布,經(jīng)過完整測(cè)試后,在2005年,與Solaris 10一同完整發(fā)布。
- Linux-VServer是通過向Linux內(nèi)核添加操作系統(tǒng)級(jí)虛擬化功能而創(chuàng)建的虛擬專用服務(wù)器實(shí)現(xiàn)。它是作為開源軟件開發(fā)和發(fā)布的。
14.總結(jié)
隨著微服務(wù)和云原生技術(shù)的大行其道,容器的生態(tài)系統(tǒng)的吸引了越來越多的玩家。Docker作為昔日王者,受到了諸多其它后起之秀的挑戰(zhàn),我們可以預(yù)期未來更多的組織會(huì)加入到下面的這張圖里。
希望本文能夠幫助你了解容器技術(shù)的基本知識(shí),在面對(duì)諸多容器技術(shù)的術(shù)語和各種容器運(yùn)行時(shí)的時(shí)候,不再手足無措。