Linux 容器是一個(gè)在單一 Linux 主機(jī)上提供多個(gè)隔離的 Linux 環(huán)境的操作系統(tǒng)級(jí)虛擬[1]技術(shù)。不像虛擬機(jī)(VM),容器并不需要運(yùn)行專(zhuān)用的訪客操作系統(tǒng)。容器們共享宿主機(jī)的操作系統(tǒng)內(nèi)核,并使用訪客操作系統(tǒng)的系統(tǒng)庫(kù)來(lái)提供所需的功能。由于不需要專(zhuān)用的操作系統(tǒng),因此容器要比虛擬器啟動(dòng)快得多。
(圖片來(lái)自: Docker Inc.)
容器借助 Linux 內(nèi)核的 Namespaces、Apparmor、SELinux 情景模式、chroot 和 CGroup 等功能來(lái)提供類(lèi)似于虛擬機(jī)的隔離環(huán)境。Linux 的安全模塊可以確保正確地控制容器對(duì)宿主機(jī)和內(nèi)核的訪問(wèn),從而避免各種入侵活動(dòng)。此外,在宿主機(jī)上可以運(yùn)行不同的 Linux 發(fā)行版,只要它們運(yùn)行在同樣的 CPU 架構(gòu)下。
簡(jiǎn)單來(lái)說(shuō),容器提供的是一種基于各種 Linux 發(fā)行版創(chuàng)建容器鏡像的方法、一套管理容器生命周期的 API、與該 API 交互的客戶端工具、保存快照的功能、在宿主機(jī)之間遷移容器實(shí)例的能力,等等。
容器歷史
以下是容器簡(jiǎn)史,內(nèi)容來(lái)自維基百科及其它來(lái)源:
1979 — chroot
容器的概念始于 1979 年的 UNIX chroot[2],它是一個(gè) UNIX 操作系統(tǒng)上的系統(tǒng)調(diào)用,用于將一個(gè)進(jìn)程及其子進(jìn)程的根目錄改變到文件系統(tǒng)中的一個(gè)新位置,讓這些進(jìn)程只能訪問(wèn)到該目錄。這個(gè)功能的想法是為每個(gè)進(jìn)程提供獨(dú)立的磁盤(pán)空間。其后在 1982年,它被加入到了 BSD 系統(tǒng)中。
2000 — FreeBSD Jails
FreeBSD Jails[3] 是最早的容器技術(shù)之一,它由 R&D Associates 公司的 Derrick T. Woolworth 在 2000 年為 FreeBSD 引入。這是一個(gè)類(lèi)似 chroot 的操作系統(tǒng)級(jí)的系統(tǒng)調(diào)用,但是為文件系統(tǒng)、用戶、網(wǎng)絡(luò)等的隔離增加了進(jìn)程沙盒功能。因此,它可以為每個(gè) jail 指定 IP 地址、可以對(duì)軟件的安裝和配置進(jìn)行定制,等等。
2001 — Linux VServer
Linux VServer[4] 是另外一種 jail 機(jī)制,它用于對(duì)計(jì)算機(jī)系統(tǒng)上的資源(如文件系統(tǒng)、CPU 處理時(shí)間、網(wǎng)絡(luò)地址和內(nèi)存等)進(jìn)行安全地劃分。每個(gè)所劃分的分區(qū)叫做一個(gè)安全上下文,在其中的虛擬系統(tǒng)叫做虛擬私有服務(wù)器。
2004 — Solaris Containers
Solaris Containers[5] 支持在 x86 和 SPARC 系統(tǒng),首次出現(xiàn)在 2004 年 2 月發(fā)布的 Solaris 10 的 build 51 beta 上,其后完整發(fā)布在 2005 年的 Solaris 10 上。 Solaris Container 是由系統(tǒng)資源控制和通過(guò) zones 提供的邊界分離所組合而成的。zones 是一個(gè)單一操作系統(tǒng)實(shí)例中的完全隔離的虛擬服務(wù)器。
2005 — OpenVZ
OpenVZ[6] 類(lèi)似于 Solaris Containers,它通過(guò)對(duì) Linux 內(nèi)核進(jìn)行補(bǔ)丁來(lái)提供虛擬化、隔離、資源管理和狀態(tài)檢查。每個(gè) OpenVZ 容器都有一套隔離的文件系統(tǒng)、用戶及用戶組、進(jìn)程樹(shù)、網(wǎng)絡(luò)、設(shè)備和 IPC 對(duì)象。
2006 — Process Containers
Process Containers[7] 是由 Google 在 2006 年實(shí)現(xiàn)的,用于對(duì)一組進(jìn)程進(jìn)行限制、記賬、隔離資源使用(CPU、內(nèi)存、磁盤(pán) I/O、網(wǎng)絡(luò)等)。后來(lái)為了避免和 Linux 內(nèi)核上下文中的“容器”一詞混淆而改名為 Control Groups。它被合并到了 2.6.24 內(nèi)核中。這表明 Google 很早就參與了容器技術(shù)的開(kāi)發(fā),以及它們是如何回饋到社區(qū)的。
2007 — Control Groups
如上面所述,Control Groups (即 cgroups)是由 Google 實(shí)現(xiàn)的,并于 2007 年加到了 Linux 內(nèi)核中。
2008 — LXC
LXC[8] 的意思是 LinuX Containers,它是第一個(gè)最完善的 Linux 容器管理器的實(shí)現(xiàn)方案,是通過(guò) cgroups 和 Linux 名字空間實(shí)現(xiàn)的。LXC 存在于 liblxc 庫(kù)中,提供了各種編程語(yǔ)言的 API 實(shí)現(xiàn),包括 Python3、Python2、Lua、Go、Ruby 和 Haskell。與其它容器技術(shù)不同的是, LXC 可以工作在普通的 Linux 內(nèi)核上,而不需要增加補(bǔ)丁。現(xiàn)在 LXC project[9] 是由 Canonical 公司贊助并托管的。
2011 — Warden
Warden[10] 是由 CloudFoundry 在 2011 年開(kāi)發(fā)的,開(kāi)始階段是使用的 LXC,之后替換為他們自己的實(shí)現(xiàn)方案。不像 LXC,Warden 并不緊密耦合到 Linux 上,而是可以工作在任何可以提供隔離環(huán)境的操作系統(tǒng)上。它以后臺(tái)守護(hù)進(jìn)程的方式運(yùn)行,為容器管理提供了 API。請(qǐng)參考 Warden 文檔[11]和這個(gè)博客文章[12]了解更多。
2013 — LMCTFY
lmctfy[13] 的意思是“讓我為你包含”。這是一個(gè) Google 容器技術(shù)的開(kāi)源版本,提供 Linux 應(yīng)用容器。Google 啟動(dòng)這個(gè)項(xiàng)目旨在提供性能可保證的、高資源利用率的、資源共享的、可超售的、接近零消耗的容器(參考自:lmctfy 演講稿[14])?,F(xiàn)在為 Kubernetes 所用的 cAdvisor 工具就是從 lmctfy 項(xiàng)目的成果開(kāi)始的。lmctfy 首次發(fā)布于 2013 年10月,在 2015 年 Google 決定貢獻(xiàn)核心的 lmctfy 概念,并抽象成 libcontainer,因此,lmctfy 現(xiàn)在已經(jīng)沒(méi)有活躍的開(kāi)發(fā)了。
lincontainer 項(xiàng)目最初由 Docker[15] 發(fā)起,現(xiàn)在已經(jīng)被移交給了開(kāi)放容器基金會(huì)[16]。
2013 — Docker
Docker[17] 是到現(xiàn)在為止最流行和使用廣泛的容器管理系統(tǒng)。它最初是一個(gè)叫做 dotCloud 的 PaaS 服務(wù)公司的內(nèi)部項(xiàng)目,后來(lái)該公司改名為 Docker。類(lèi)似 Warden,Docker 開(kāi)始階段使用的也是 LXC ,之后采用自己開(kāi)發(fā)的 libcontainer 替代了它。不像其它的容器平臺(tái),Docker 引入了一整個(gè)管理容器的生態(tài)系統(tǒng),這包括高效、分層的容器鏡像模型、全局和本地的容器注冊(cè)庫(kù)、清晰的 REST API、命令行等等。稍后的階段, Docker 推動(dòng)實(shí)現(xiàn)了一個(gè)叫做 Docker Swarm 的容器集群管理方案。
2014 — Rocket
Rocket[18] 是由 CoreOS 所啟動(dòng)的項(xiàng)目,非常類(lèi)似于 Docker,但是修復(fù)了一些 Docker 中發(fā)現(xiàn)的問(wèn)題。CoreOS 說(shuō)他們的目的是提供一個(gè)比 Docker 更嚴(yán)格的安全性和產(chǎn)品需求。更重要的是,它是在一個(gè)更加開(kāi)放的標(biāo)準(zhǔn) App Container 規(guī)范上實(shí)現(xiàn)的。在 Rocket 之外,CoreOS 也開(kāi)發(fā)了其它幾個(gè)可以用于 Docker 和 Kubernetes的容器相關(guān)的產(chǎn)品,如:CoreOS 操作系統(tǒng)[19]、etcd[20] 和 flannel[21]。
2016 — Windows Containers
微軟 2015 年也在 Windows Server 上為基于 Windows 的應(yīng)用添加了容器支持,它稱(chēng)之為 Windows Containers[22]。它與 Windows Server 2016 一同發(fā)布。通過(guò)該實(shí)現(xiàn), Docker 可以原生地在 Windows 上運(yùn)行 Docker 容器,而不需要啟動(dòng)一個(gè)虛擬機(jī)來(lái)運(yùn)行 Docker( Windows 上早期運(yùn)行 Docker 需要使用 Linux 虛擬機(jī))。
容器的未來(lái)
截止到今天(2016年1月),在行業(yè)內(nèi)有一個(gè)顯著趨勢(shì),部署軟件應(yīng)用從虛擬機(jī)逐漸移到了容器。其主要的原因是容器相比于虛擬機(jī)而言更加靈活和低消耗。Google 已經(jīng)使用容器技術(shù)好多年了,它在 Borg 和 Omega[23] 容器集群管理平臺(tái)上可以成規(guī)模地運(yùn)行 Google 應(yīng)用。更重要的是,Google 為容器領(lǐng)域貢獻(xiàn)了 cgroups 的實(shí)現(xiàn)和參與了 libcontainer 項(xiàng)目。Google 也在過(guò)去這些年借助容器在性能、資源利用和整體效率方面取得了巨大收益。最近,一直沒(méi)有操作系統(tǒng)級(jí)的虛擬化技術(shù)的微軟,也在 Window Server 上迅速采取動(dòng)作實(shí)現(xiàn)了對(duì)容器的原生支持。
Docker 、Rocket 以及其它的容器平臺(tái)并不能以一個(gè)單一主機(jī)運(yùn)行在產(chǎn)品環(huán)境中,原因是這樣面臨著單點(diǎn)故障。當(dāng)一組容器運(yùn)行在一個(gè)單一宿主機(jī)時(shí),如果宿主機(jī)失效,所有運(yùn)行在該宿主機(jī)上的容器也會(huì)失效。要避免這個(gè)問(wèn)題,應(yīng)該使用容器宿主機(jī)集群。Google 借助其在 Borg 中取得的經(jīng)驗(yàn),開(kāi)發(fā)了一個(gè)叫做 Kubernetes[24] 的開(kāi)源容器集群管理系統(tǒng)。Docker 也啟動(dòng)了一個(gè)叫做 Docker Swarm[25] 的解決方案。目前這些解決方案還都處于相當(dāng)早期的階段,也許需要幾個(gè)月或來(lái)年才實(shí)現(xiàn)完整的功能集合,才能變得穩(wěn)定,從而廣泛應(yīng)用于行業(yè)內(nèi)的產(chǎn)品環(huán)境中。
微服務(wù)[26]是另一個(gè)突破性技術(shù),在軟件架構(gòu)上可以將容器用于部署。微服務(wù)并不是一個(gè)新東西,只是一個(gè)相比標(biāo)準(zhǔn)的 Web 服務(wù)超快的輕量級(jí) Web 服務(wù)。這是通過(guò)將功能單元(也許是一個(gè)單一服務(wù)或 API 方法)打包到一個(gè)服務(wù)中,并內(nèi)嵌其到一個(gè)輕量級(jí) Web 服務(wù)器軟件中實(shí)現(xiàn)的。
通過(guò)對(duì)上面的介紹,我們可以預(yù)測(cè)接下來(lái)幾年,容器也許會(huì)替代虛擬機(jī),某些情況下也許會(huì)全部取代。去年我為一些企業(yè)在 POC 層面上實(shí)現(xiàn)了基于容器的解決方案。也有人想要在產(chǎn)品環(huán)境中嘗試它們,這一天也許在容器集群管理系統(tǒng)進(jìn)一步成熟后很快到來(lái)。
[1]: https://en.wikipedia.org/wiki/Operating-system-level_virtualization#IMPLEMENTATIONS
[2]: https://en.wikipedia.org/wiki/Chroot
[3]: https://en.wikipedia.org/wiki/FreeBSD_jail
[4]: https://en.wikipedia.org/wiki/Linux-VServer
[5]: https://en.wikipedia.org/wiki/Solaris_Containers
[6]: https://en.wikipedia.org/wiki/OpenVZ
[7]: https://en.wikipedia.org/wiki/Cgroups
[8]: https://en.wikipedia.org/wiki/LXC
[9]: https://linuxcontainers.org/lxc/introduction/
[10]: https://docs.cloudfoundry.org/concepts/architecture/warden.html
[11]: https://docs.cloudfoundry.org/concepts/architecture/warden.html
[12]: http://blog.altoros.com/cloud-foundry-containers-warden-docker-garden.html
[13]: https://github.com/google/lmctfy
[14]: http://www.linuxplumbersconf.org/2013/ocw//system/presentations/1239/original/lmctfy%20(1).pdf
[15]: https://github.com/docker/libcontainer
[16]: https://github.com/opencontainers/runc/tree/master/libcontainer
[17]: https://en.wikipedia.org/wiki/Docker_(software)
[18]: https://coreos.com/blog/rocket/
[19]: https://en.wikipedia.org/wiki/CoreOS
[20]: https://coreos.com/etcd/
[21]: https://github.com/coreos/flannel
[22]: https://msdn.microsoft.com/en-us/virtualization/windowscontainers/about/about_overview
[23]: http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/43438.pdf
[24]: http://kubernetes.io/
[25]: https://docs.docker.com/swarm/
[26]: http://martinfowler.com/articles/microservices.html
聯(lián)系客服