天天看點

雲原生必備知識: Linux 容器-隔離

所屬技術領域:

雲原生

| 名詞定義 |

Linux 核心從版本 2.4.19 開始陸續引入了 namespace 的概念。其目的是将某個特定的全局系統資源(global system resource)通過抽象方法使得namespace 中的程序看起來擁有它們自己的隔離的全局系統資源執行個體(The purpose of each namespace is to wrap a particular global system resource in an abstraction that makes it appear to the processes within the namespace that they have their own isolated instance of the global resource. )。Linux 核心中實作了六種 namespace,按照引入的先後順序,清單如下:

namespace 引入的相關核心版本 被隔離的全局系統資源 在容器語境下的隔離效果

Mount namespaces Linux 2.4.19

檔案系統挂接點 每個容器能看到不同的檔案系統層次結構

UTS namespaces Linux 2.6.19

nodename 和 domainname 每個容器可以有自己的 hostname 和 domainame

IPC namespaces Linux 2.6.19

特定的程序間通信資源,包括System V IPC 和 POSIX message queues

每個容器有其自己的 System V IPC 和 POSIX 消息隊列檔案系統,是以,隻有在同一個 IPC namespace 的程序之間才能互相通信

PID namespaces Linux 2.6.24

程序 ID 數字空間 (process ID number space) 每個 PID namespace 中的程序可以有其獨立的 PID; 每個容器可以有其 PID 為 1 的root 程序;也使得容器可以在不同的 host 之間遷移,因為 namespace 中的程序 ID 和 host 無關了。這也使得容器中的每個程序有兩個PID:容器中的 PID 和 host 上的 PID。

Network namespaces 始于Linux 2.6.24 完成于 Linux 2.6.29

網絡相關的系統資源 每個容器用有其獨立的網絡裝置,IP 位址,IP 路由表,/proc/net 目錄,端口号等等。這也使得一個 host 上多個容器内的同一個應用都綁定到各自容器的 80 端口上。

User namespaces 始于 Linux 2.6.23 完成于 Linux 3.8)

使用者群組 ID 空間 在 user namespace 中的程序的使用者群組 ID 可以和在 host 上不同; 每個 container 可以有不同的 user 和 group id;一個 host 上的非特權使用者可以成為 user namespace 中的特權使用者;

Linux namespace 的概念說簡單也簡單說複雜也複雜。簡單來說,我們隻要知道,處于某個 namespace 中的程序,能看到獨立的它自己的隔離的某些特定系統資源;複雜來說,可以去看看 Linux 核心中實作 namespace 的原理,網絡上也有大量的文檔供參考,這裡不再贅述。

| 發展曆程 |

以下是從維基百科和其他來源提取的容器曆史的簡短摘要:

1979年-chroot

容器的概念早在1979年就開始使用UNIX chroot。這是一個UNIX作業系統系統調用,用于更改程序的根目錄,并将其作為子檔案到檔案系統中的新位置,該位置僅對給定程序可見。此功能的想法是為每個程序提供隔離的磁盤空間。 1982年晚些時候,這被添加到BSD。

2000年-FreeBSD Jails

FreeBSD Jails是由Derrick T. Woolworth在2000年為R&D Associates for FreeBSD推出的早期容器技術之一。它是一個類似于chroot作業系統的系統調用,包括用于隔離檔案系統、使用者、網絡的其他程序沙盒功能。是以,它可以為每個Jails、自定義軟體安裝和配置等提供配置設定IP位址的方法。

2001年-Linux VServer

Linux VServer是另一種jail機制,可用于安全地分區計算機系統上的資源(檔案系統,CPU時間,網絡位址和記憶體)。每個分區稱為安全上下文,其中的虛拟化系統稱為虛拟專用伺服器。

2004年-Solaris容器

Solaris Containers是針對x86和SPARC系統推出的,首次于2004年2月在Solaris 10的build 51 beta版中公開釋出,随後在Solaris 10,2005的第一個完整版本中釋出。Solaris Container是系統資源控制和邊界的組合區域提供的分離。在單個作業系統執行個體中充當完全隔離的虛拟伺服器。

2005年-OpenVZ

OpenVZ與Solaris Containers類似,并使用修補的Linux核心來提供虛拟化,隔離,資源管理和檢查點。每個OpenVZ容器都有一個獨立的檔案系統,使用者和使用者組,程序樹,網絡,裝置和IPC對象。

2006年-流程容器

Process Containers于2006年在Google實施,用于限制、統計和隔離程序集合的資源使用(CPU、記憶體、磁盤I/O、網絡等)。後來,它被重命名為控制組,以避免Linux核心上下文中“容器”一詞的多重含義混淆,并合并到Linux核心2.6.24中。這顯示了谷歌在集裝箱技術上的早期參與,以及他們是如何做出貢獻的。

2007年-控制組

如前所述,控制組AKA cgroup是由Google實作的,并于2007年添加到Linux核心中。

2008年-LXC

LXC代表Linux容器,它是Linux容器管理器的第一個、最完整的實作。它是使用cgroup和Linux名稱空間實作的。LXC是在liblxc庫中傳遞的,并為Python 3、Python 2、Lua、Go、Ruby和Haskell中的API提供了語言綁定。與其他容器技術不同,LXC在Vanila Linux核心上工作,不需要任何更新檔。今天LXC項目由佳能有限公司贊助。

2011年-守望者

Warden在2011年由CloudFoundry實施,在初始階段使用LXC,後來又用自己的實作取而代之。與LXC不同,Warden并沒有與Linux緊密結合。相反,它可以在任何可以提供隔離環境的作業系統上工作。它作為守護程式運作,并提供用于管理容器的API。

2013-lmctfy

lmctfy是Google容器堆棧的開源版本,提供Linux應用程式容器。谷歌啟動了這個項目的目的是提供有保證的性能,高資源使用率,共享資源,容器的近零開銷。今天Kubernetes使用的cAdvisor工具是由lmctfy項目啟動的。 lmctfy的最初版本于2013年10月釋出,2015年,Google決定向libcontainer提供核心lmctfy概念和抽象。結果現在LMCTFY沒有進行積極的開發。

libcontainer項目最初由Docker啟動,現在已經轉移到Open Container Foundation。

2013年-Docker

截至2016年1月,Docker是最受歡迎和最廣泛使用的容器管理系統。它是作為一個名為dotCloud的平台即服務公司的内部項目開發的,後來改名為Docker。與Warden類似,Docker在初始階段也使用了LXC,後來用它自己的libcontainer庫替換了LXC。與任何其他容器平台不同,Docker引入了用于管理容器的整個生态系統。這包括一個高效的分層容器映像模型,一個全局和本地容器系統資料庫,一個幹淨的REST API,一個CLI等。在稍後階段,Docker還主動實作了一個名為Docker Swarm的容器叢集管了解決方案。

2014-Rocket

Rocket是一個與Docker非常相似的項目,用于修複他們在Docker中發現的一些缺陷。CoreOS提到,他們的目标是提供比Docker更嚴格的安全和生産要求。更重要的是,它是在AppContainer規範上實作的,是一個更加開放的标準。除了Rocket,CoreOS還開發了Docker和Kubernetes使用的其他幾種與集裝箱有關的産品。

2016-Windows容器

微軟還主動在2015年為基于Windows的應用程式(稱為Windows容器)向Microsoft Windows Server作業系統添加容器支援。這将與Microsoft Windows Server 2016一起釋出。通過這種實作,Docker可以在Windows上本地運作Docker容器,而無需運作虛拟機來運作Docker(早期的Docker使用Linux VM在Windows上運作)。

| 技術特點 |

檔案系統隔離:每個容器都有自己的root檔案系統

程序隔離:每個容器都運作在自己的程序環境中

網絡隔離:容器件的虛拟網絡接口和IP位址都是分開的

資源隔離和分組:使用cgroup将CPU和記憶體之類的資源獨立配置設定給每個容器

适用場景:

容器的優點在于以接近實體機的運作效率提供了虛拟化功能、能比虛拟機達到更高的執行個體密度、達到秒級的啟動速度。Docker又加上了層級鏡像的創新,使得軟體的釋出和部署非常便捷。能用上這些優點的地方,自然就是Docker的使用場景了。

實際上這樣的場景是非常多的,這也是Docker的生态發展的如此快速和繁榮的原因之一。我們看到有無數基于Docker的開源項目産生,包括CoreOS、Kubernetes、Deis等等,而現有的開源項目也都紛紛擁抱Docker,例如Openstack、Mesos、Cloud Foundry等等,我們也看到國内外各個雲平台争先恐後的宣布支援Docker。

不過,對于企業來說,最容易用上Docker的場景,我認為還是用Docker來搭建私有雲,以及把Docker用在持續內建平台上。

資料來源:

  1. 名詞定義: https://www.cnblogs.com/sammyliu/p/5878973.html
  2. 發展曆程:

    CSDN社群

    https://blog.csdn.net/g6U8W7p06dCO99fQ3/article/details/91469785
  3. 适用場景:CSDN社群 https://www.csdn.net/article/2015-03-30/2824347