Linux 容器技術史話:從 chroot 到未來
Linux 容器是一個在單一 Linux 主機上提供多個隔離的 Linux 環境的操作系統級虛擬技術。不像虛擬機(VM),容器並不需要運行專用的 訪客 操作系統。容器們共享 宿主機的 操作系統內核,並使用訪客操作系統的系統庫來提供所需的功能。由於不需要專用的操作系統,因此容器要比虛擬器啟動快得多。
(圖片來自: Docker Inc.)
容器藉助 Linux 內核的 Namespaces、Apparmor、SELinux 情景模式 、chroot 和 CGroup 等功能來提供類似於虛擬機的隔離環境。Linux 的安全模塊可以確保正確地控制容器對宿主機和內核的訪問,從而避免各種入侵活動。此外,在宿主機上可以運行不同的 Linux 發行版,只要它們運行在同樣的 CPU 架構下。
簡單來說,容器提供的是一種基於各種 Linux 發行版創建容器鏡像的方法、一套管理容器生命周期的 API、與該 API 交互的客戶端工具、保存快照的功能、在宿主機之間遷移容器實例的能力,等等。
容器歷史
以下是容器簡史,內容來自維基百科及其它來源:
1979 — chroot
容器的概念始於 1979 年的 UNIX chroot,它是一個 UNIX 操作系統上的系統調用,用於將一個進程及其子進程的根目錄改變到文件系統中的一個新位置,讓這些進程只能訪問到該目錄。這個功能的想法是為每個進程提供獨立的磁碟空間。其後在 1982年,它被加入到了 BSD 系統中。
2000 — FreeBSD Jails
FreeBSD Jails 是最早的容器技術之一,它由 R&D Associates 公司的 Derrick T. Woolworth 在 2000 年為 FreeBSD 引入。這是一個類似 chroot 的操作系統級的系統調用,但是為文件系統、用戶、網路等的隔離增加了進程沙盒功能。因此,它可以為每個 jail 指定 IP 地址、可以對軟體的安裝和配置進行定製,等等。
2001 — Linux VServer
Linux VServer 是另外一種 jail 機制,它用於對計算機系統上的資源(如文件系統、CPU 處理時間、網路地址和內存等)進行安全地劃分。每個所劃分的分區叫做一個 安全上下文 ,在其中的虛擬系統叫做 虛擬私有伺服器 。
2004 — Solaris Containers
Solaris Containers 支持在 x86 和 SPARC 系統,首次出現在 2004 年 2 月發布的 Solaris 10 的 build 51 beta 上,其後完整發布在 2005 年的 Solaris 10 上。 Solaris Container 是由系統資源控制和通過 zones 提供的 邊界分離 所組合而成的。zones 是一個單一操作系統實例中的完全隔離的虛擬伺服器。
2005 — OpenVZ
OpenVZ 類似於 Solaris Containers,它通過對 Linux 內核進行補丁來提供虛擬化、隔離、資源管理和 狀態檢查 。每個 OpenVZ 容器都有一套隔離的文件系統、用戶及用戶組、進程樹、網路、設備和 IPC 對象。
2006 — Process Containers
Process Containers 是由 Google 在 2006 年實現的,用於對一組進程進行限制、記賬、隔離資源使用(CPU、內存、磁碟 I/O、網路等)。後來為了避免和 Linux 內核上下文中的「容器」一詞混淆而改名為 Control Groups。它被合併到了 2.6.24 內核中。這表明 Google 很早就參與了容器技術的開發,以及它們是如何回饋到社區的。
2007 — Control Groups
如上面所述,Control Groups (即 cgroups)是由 Google 實現的,並於 2007 年加到了 Linux 內核中。
2008 — LXC
LXC 的意思是 LinuX Containers,它是第一個最完善的 Linux 容器管理器的實現方案,是通過 cgroups 和 Linux 名字空間 實現的。LXC 存在於 liblxc 庫中,提供了各種編程語言的 API 實現,包括 Python3、Python2、Lua、Go、Ruby 和 Haskell。與其它容器技術不同的是, LXC 可以工作在普通的 Linux 內核上,而不需要增加補丁。現在 LXC project 是由 Canonical 公司贊助並託管的。
2011 — Warden
Warden 是由 CloudFoundry 在 2011 年開發的,開始階段是使用的 LXC,之後替換為他們自己的實現方案。不像 LXC,Warden 並不緊密耦合到 Linux 上,而是可以工作在任何可以提供隔離環境的操作系統上。它以後台守護進程的方式運行,為容器管理提供了 API。請參考 Warden 文檔和這個博客文章了解更多。
2013 — LMCTFY
lmctfy 的意思是「 讓我為你包含 」。這是一個 Google 容器技術的開源版本,提供 Linux 應用容器。Google 啟動這個項目旨在提供性能可保證的、高資源利用率的、資源共享的、可超售的、接近零消耗的容器(參考自:lmctfy 演講稿)。現在為 Kubernetes 所用的 cAdvisor 工具就是從 lmctfy 項目的成果開始的。lmctfy 首次發佈於 2013 年10月,在 2015 年 Google 決定貢獻核心的 lmctfy 概念,並抽象成 libcontainer,因此,lmctfy 現在已經沒有活躍的開發了。
lincontainer 項目最初由 Docker 發起,現在已經被移交給了 開放容器基金會 。
2013 — Docker
Docker 是到現在為止最流行和使用廣泛的容器管理系統。它最初是一個叫做 dotCloud 的 PaaS 服務公司的內部項目,後來該公司改名為 Docker。類似 Warden,Docker 開始階段使用的也是 LXC ,之後採用自己開發的 libcontainer 替代了它。不像其它的容器平台,Docker 引入了一整個管理容器的生態系統,這包括高效、分層的容器鏡像模型、全局和本地的容器註冊庫、清晰的 REST API、命令行等等。稍後的階段, Docker 推動實現了一個叫做 Docker Swarm 的容器集群管理方案。
2014 — Rocket
Rocket 是由 CoreOS 所啟動的項目,非常類似於 Docker,但是修復了一些 Docker 中發現的問題。CoreOS 說他們的目的是提供一個比 Docker 更嚴格的安全性和產品需求。更重要的是,它是在一個更加開放的標準 App Container 規範上實現的。在 Rocket 之外,CoreOS 也開發了其它幾個可以用於 Docker 和 Kubernetes的容器相關的產品,如:CoreOS 操作系統、etcd 和 flannel。
2016 — Windows Containers
微軟 2015 年也在 Windows Server 上為基於 Windows 的應用添加了容器支持,它稱之為 Windows Containers。它與 Windows Server 2016 一同發布。通過該實現, Docker 可以原生地在 Windows 上運行 Docker 容器,而不需要啟動一個虛擬機來運行 Docker( Windows 上早期運行 Docker 需要使用 Linux 虛擬機)。
容器的未來
截止到今天(2016年1月),在行業內有一個顯著趨勢,部署軟體應用從虛擬機逐漸移到了容器。其主要的原因是容器相比於虛擬機而言更加靈活和低消耗。Google 已經使用容器技術好多年了,它在 Borg 和 Omega 容器集群管理平台上可以成規模地運行 Google 應用。更重要的是,Google 為容器領域貢獻了 cgroups 的實現和參與了 libcontainer 項目。Google 也在過去這些年藉助容器在性能、資源利用和整體效率方面取得了巨大收益。最近,一直沒有操作系統級的虛擬化技術的微軟,也在 Window Server 上迅速採取動作實現了對容器的原生支持。
Docker 、Rocket 以及其它的容器平台並不能以一個單一主機運行在產品環境中,原因是這樣面臨著單點故障。當一組容器運行在一個單一宿主機時,如果宿主機失效,所有運行在該宿主機上的容器也會失效。要避免這個問題,應該使用容器宿主機集群。Google 藉助其在 Borg 中取得的經驗,開發了一個叫做 Kubernetes 的開源容器集群管理系統。Docker 也啟動了一個叫做 Docker Swarm 的解決方案。目前這些解決方案還都處於相當早期的階段,也許需要幾個月或來年才實現完整的功能集合,才能變得穩定,從而廣泛應用於行業內的產品環境中。
微服務 是另一個突破性技術,在軟體架構上可以將容器用於部署。微服務並不是一個新東西,只是一個相比標準的 Web 服務超快的輕量級 Web 服務。這是通過將功能單元(也許是一個單一服務或 API 方法)打包到一個服務中,並內嵌其到一個輕量級 Web 伺服器軟體中實現的。
通過對上面的介紹,我們可以預測接下來幾年,容器也許會替代虛擬機,某些情況下也許會全部取代。去年我為一些企業在 POC 層面上實現了基於容器的解決方案。也有人想要在產品環境中嘗試它們,這一天也許在容器集群管理系統進一步成熟後很快到來。
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive