Linux 容器是一個在單一 Linux 主機上提供多個隔離的 Linux 環境的操做系統級虛擬技術。不像虛擬機(VM),容器並不須要運行專用的訪客(guest)操做系統。容器們共享宿主機的(host)操做系統內核,並使用訪客操做系統的系統庫來提供所需的功能。因爲不須要專用的操做系統,所以容器要比虛擬器啓動快得多。html
Virtual Machines Vs Containerslinux
(圖片來自: Docker Inc.)docker
容器藉助 Linux 內核的 Namespaces、Apparmor、SELinux 情景模式(profile)、chroot 和 CGroup 等功能來提供相似於虛擬機的隔離環境。Linux 的安全模塊能夠確保正確地控制容器對宿主機和內核的訪問,從而避免各類入侵活動。此外,在宿主機上能夠運行不一樣的 Linux 發行版,只要它們運行在一樣的 CPU 架構下。編程
簡單來講,容器提供的是一種基於各類 Linux 發行版建立容器鏡像的方法、一套管理容器生命週期的 API、與該 API 交互的客戶端工具、保存快照的功能、在宿主機之間遷移容器實例的能力,等等。windows
如下是容器簡史,內容來自維基百科及其它來源:安全
容器的概念始於 1979 年的 UNIX chroot,它是一個 UNIX 操做系統上的系統調用,用於將一個進程及其子進程的根目錄改變到文件系統中的一個新位置,讓這些進程只能訪問到該目錄。這個功能的想法是爲每一個進程提供獨立的磁盤空間。其後在 1982年,它被加入到了 BSD 系統中。服務器
FreeBSD Jails 是最先的容器技術之一,它由 R&D Associates 公司的 Derrick T. Woolworth 在 2000 年爲 FreeBSD 引入。這是一個相似 chroot 的操做系統級的系統調用,可是爲文件系統、用戶、網絡等的隔離增長了進程沙盒功能。所以,它能夠爲每一個 jail 指定 IP 地址、能夠對軟件的安裝和配置進行定製,等等。網絡
Linux VServer 是另一種 jail 機制,它用於對計算機系統上的資源(如文件系統、CPU 處理時間、網絡地址和內存等)進行安全地劃分。每一個所劃分的分區叫作一個安全上下文(security context),在其中的虛擬系統叫作虛擬私有服務器(virtual private server,VPS)。架構
Solaris Containers 支持在 x86 和 SPARC 系統,首次出如今 2004 年 2 月發佈的 Solaris 10 的 build 51 beta 上,其後完整發布在 2005 年的 Solaris 10 上。 Solaris Container 是由系統資源控制和經過 zones 提供的邊界分離(boundary separation)所組合而成的。zones 是一個單一操做系統實例中的徹底隔離的虛擬服務器。編程語言
OpenVZ 相似於 Solaris Containers,它經過對 Linux 內核進行補丁來提供虛擬化、隔離、資源管理和狀態檢查(checkpointing)。每一個 OpenVZ 容器都有一套隔離的文件系統、用戶及用戶組、進程樹、網絡、設備和 IPC 對象。
Process Containers 是由 Google 在 2006 年實現的,用於對一組進程進行限制、記帳、隔離資源使用(CPU、內存、磁盤 I/O、網絡等)。後來爲了不和 Linux 內核上下文中的「容器」一詞混淆而更名爲 Control Groups。它被合併到了 2.6.24 內核中。這代表 Google 很早就參與了容器技術的開發,以及它們是如何回饋到社區的。
如上面所述,Control Groups (即 cgroups)是由 Google 實現的,並於 2007 年加到了 Linux 內核中。#p#分頁標題#e#
LXC 的意思是 LinuX Containers,它是第一個最完善的 Linux 容器管理器的實現方案,是經過 cgroups 和 Linux 名字空間(namespace)實現的。LXC 存在於 liblxc 庫中,提供了各類編程語言的 API 實現,包括 Python三、Python二、Lua、Go、Ruby 和 Haskell。與其它容器技術不一樣的是, LXC 能夠工做在普通的 Linux 內核上,而不須要增長補丁。如今 LXC project 是由 Canonical 公司贊助並託管的。
Warden 是由 CloudFoundry 在 2011 年開發的,開始階段是使用的 LXC,以後替換爲他們本身的實現方案。不像 LXC,Warden 並不緊密耦合到 Linux 上,而是能夠工做在任何能夠提供隔離環境的操做系統上。它之後臺守護進程的方式運行,爲容器管理提供了 API。請參考 Warden 文檔和這個博客文章瞭解更多。
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)。
Docker 是到如今爲止最流行和使用普遍的容器管理系統。它最初是一個叫作 dotCloud 的 PaaS 服務公司的內部項目,後來該公司更名爲 Docker。相似 Warden,Docker 開始階段使用的也是 LXC ,以後採用本身開發的 libcontainer 替代了它。不像其它的容器平臺,Docker 引入了一整個管理容器的生態系統,這包括高效、分層的容器鏡像模型、全局和本地的容器註冊庫、清晰的 REST API、命令行等等。稍後的階段, Docker 推進實現了一個叫作 Docker Swarm 的容器集羣管理方案。
Rocket 是由 CoreOS 所啓動的項目,很是相似於 Docker,可是修復了一些 Docker 中發現的問題。CoreOS 說他們的目的是提供一個比 Docker 更嚴格的安全性和產品需求。更重要的是,它是在一個更加開放的標準 App Container 規範上實現的。在 Rocket 以外,CoreOS 也開發了其它幾個能夠用於 Docker 和 Kubernetes的容器相關的產品,如:CoreOS 操做系統、etcd 和 flannel。
微軟 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 服務器軟件中實現的。#p#分頁標題#e#
經過對上面的介紹,咱們能夠預測接下來幾年,容器也許會替代虛擬機,某些狀況下也許會所有取代。去年我爲一些企業在 POC 層面上實現了基於容器的解決方案。也有人想要在產品環境中嘗試它們,這一天也許在容器集羣管理系統進一步成熟後很快到來。
轉載於: http://www.itxuexiwang.com/a/liunxjishu/2016/0228/178.html?1456820003