Linux 容器技術史話:從 chroot 到未來

Imesh Gunaratne發表於2016-02-04

Linux 容器是一個在單一 Linux 主機上提供多個隔離的 Linux 環境的作業系統級虛擬技術。不像虛擬機器(VM),容器並不需要執行專用的訪客guest作業系統。容器們共享宿主機的host作業系統核心,並使用訪客作業系統的系統庫來提供所需的功能。由於不需要專用的作業系統,因此容器要比虛擬器啟動快得多。

(圖片來自: Docker Inc.)

容器藉助 Linux 核心的 Namespaces、Apparmor、SELinux 情景模式profile、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 處理時間、網路地址和記憶體等)進行安全地劃分。每個所劃分的分割槽叫做一個安全上下文security context,在其中的虛擬系統叫做虛擬私有伺服器virtual private server,VPS

2004 — Solaris Containers

Solaris Containers 支援在 x86 和 SPARC 系統,首次出現在 2004 年 2 月釋出的 Solaris 10 的 build 51 beta 上,其後完整發布在 2005 年的 Solaris 10 上。 Solaris Container 是由系統資源控制和通過 zones 提供的邊界分離boundary separation所組合而成的。zones 是一個單一作業系統例項中的完全隔離的虛擬伺服器。

2005 — OpenVZ

OpenVZ 類似於 Solaris Containers,它通過對 Linux 核心進行補丁來提供虛擬化、隔離、資源管理和狀態檢查checkpointing。每個 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 名字空間namespace實現的。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 的意思是“讓我為你包含Let Me Contain That For You”。這是一個 Google 容器技術的開源版本,提供 Linux 應用容器。Google 啟動這個專案旨在提供效能可保證的、高資源利用率的、資源共享的、可超售的、接近零消耗的容器(參考自:lmctfy 演講稿)。現在為 Kubernetes 所用的 cAdvisor 工具就是從 lmctfy 專案的成果開始的。lmctfy 首次釋出於 2013 年10月,在 2015 年 Google 決定貢獻核心的 lmctfy 概念,並抽象成 libcontainer,因此,lmctfy 現在已經沒有活躍的開發了。

lincontainer 專案最初由  Docker 發起,現在已經被移交給了開放容器基金會Open Container Foundation

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 的解決方案。目前這些解決方案還都處於相當早期的階段,也許需要幾個月或來年才實現完整的功能集合,才能變得穩定,從而廣泛應用於行業內的產品環境中。

微服務Microservices 是另一個突破性技術,在軟體架構上可以將容器用於部署。微服務並不是一個新東西,只是一個相比標準的 Web 服務超快的輕量級 Web 服務。這是通過將功能單元(也許是一個單一服務或 API 方法)打包到一個服務中,並內嵌其到一個輕量級 Web 伺服器軟體中實現的。

通過對上面的介紹,我們可以預測接下來幾年,容器也許會替代虛擬機器,某些情況下也許會全部取代。去年我為一些企業在 POC 層面上實現了基於容器的解決方案。也有人想要在產品環境中嘗試它們,這一天也許在容器叢集管理系統進一步成熟後很快到來。

相關文章