01.09 看完LXC這些特性,才瞭解Docker也是站在了巨人的肩膀之上

隨著雲計算、容器技術的不斷普及,有越來越多的人開始瞭解虛擬化、瞭解Docker。對於大多數初學者來說,他們會困惑:Docker的虛擬化是如何實現的?Docker的虛擬化與傳統的虛擬化有啥區別?在Linux內核層面是如何支持Docker虛擬化的?這篇文章就學習一下Docker背後的基礎技術LXC(Linux Container)。

一、介紹

LXC是一個非常著名的並且經過嚴格測試的底層Linux容器運行時。自2008年以來,一直處於活躍的開發狀態,並在世界各地的關鍵生產環境中得到驗證。LXC的一些核心貢獻者也是幫助在Linux內核內實現各種容器化特性的人。LXC是用於訪問Linux內核容器特性用戶空間接口,通過強大的API和簡單的工具,Linux用戶可以輕鬆創建和管理系統或應用程序容器


LXC是一種內核虛擬化技術,能夠提供輕量級的虛擬化,它實現了進程級的沙盒封裝,能夠讓一些沙盒進程運行在一塊相對獨立的空間,能夠方便的控制他們的資源調度。


看完LXC這些特性,才瞭解Docker也是站在了巨人的肩膀之上

LXC與Docker的區別

二、特性

為了實現Docker的虛擬化,LXC具有以下的內核特性:

1、內核命名空間(Kernel namespaces)

一個命名空間是全局系統資源的抽象封裝,只對該命名空間內的進程可見,每個進程都有自己的專屬資源。對這些全局資源的更改也只對命名空間內部的成員進程可見,其他進程不可見。命名空間的一個用途是實現容器。


命名空間的類型

下面的表格顯示了在Linux內部的命名空間類型。表格的第二列顯示了命名空間的標識,在與其他API調用時使用。第三列是這種命名空間類型所隔離的資源信息。


看完LXC這些特性,才瞭解Docker也是站在了巨人的肩膀之上

命名空間的類型

創建一個新的命名空間一般使用cloneunshare兩個函數,並且需要CAP_SYS_ADMIN權限,因為在新的命名空間裡,創建者需要有權限更改這些全局資源讓其對後面加入命名空間的進程可見。


下面對每個命名空間進行簡要介紹:

①Cgroup命名空間

Cgroup命名空間虛擬化了進程的cgroup視圖,比如通過/proc/[pid]/cgroup 和/proc/[pid]/mountinfo看到的樣子。每個Cgroup命名空間都有自己的cgroup根目錄集。這些根目錄是/proc/[pid]/cgroup文件中相應記錄顯示的相對位置的基點。當進程使用帶有CLONE_NEWCGROUP標誌的clone和unshare創建新的Cgroup命名空間時,它當前cgroups目錄成為這個新命名空間的cgroup根目錄。


當從/proc/[pid]/cgroup讀取目標進程的cgroup成員關係時,顯示在每個記錄的第三字段中的路徑名是該進程相對於cgroup層級根目錄的相對路徑。如果目標進程的cgroup目錄位於該進程的cgroup命名空間的根目錄之外,則路徑名將顯示cgroup層次結構中每個祖先基本的../條目。


②IPC命名空間

IPC命名空間隔離某些IPC資源,即系統 V IPC對象和POSIX消息隊列。這些IPC對象的共同點是由文件系統路徑名以為的機制標識。每個IPC命名空間都有其自己的系統V IPC標識符集和其自己的POSIX消息隊列文件系統。在IPC命名空間中創建的對象對屬於該命名空間的所有其他進程可見,但對其他IPC命名空間的進程不可見。

③Network命名空間

Network命名空間提供了與網絡有關的系統資源的隔離,有網絡設備、IPv4和IPv6協議棧、IP路由表和防火牆規則。/proc/net目錄、/sys/class/net目錄以及/proc/sys/net下的各種文件,端口號(Sockets)等等。


④Mount命名空間

Mount命名空間為每個該實例中的進程提供了掛載點的隔離列表。這樣,每個掛載空間實例中的進程會看到不一樣的目錄層級。/proc/[pid]/mounts、/proc/[pid]/mountinfo和/proc/[pid]/mountstats文件的視圖與PID這個進程所在的Mount命名空間是一致的。


⑤PID命名空間

PID命名空間隔離了進程ID號空間,意味著在不同PID命名空間中的進程可以有相同的PID。PID命名空間允許容器提供一些其他的功能,如掛起、恢復容器內的進程集,遷移容器到新的主機而容器內的進程ID保持一致。PID命名空間中的PID從1開始。


⑥User命名空間

User命名空間隔離與安全性相關的標識符和屬性,尤其是用戶ID和組ID,根目錄、密鑰和功能。進程的用戶ID和組ID在User命名空間的內部和外部可以不同。特別是,進程可以在User命名空間之外具有普通的非特權用戶ID,而同時在User命名空間內部具有0的用戶ID.也就是說,該進程在該User命名空間內部有全部特權,但在User命名空間外部沒有特權。


⑦UTS命名空間

UTS命名空間提供了兩個系統標識符的隔離:hostname和NIS域名。這些標識符通過sethostname和setdomainname設置,通過uname,gethostname和getdomainname獲取。對這些標識符的更改只對該UTS命名空間內的進程可見,其他的UTS命名空間內的進程不可見。


看完LXC這些特性,才瞭解Docker也是站在了巨人的肩膀之上


2、Apparmor和SELinux

①AppArmor

AppArmor(Application Armor)是Linux的一種安全軟件,是SELinux的替代品。AppArmor是目前市場上最有效且易於使用的Linux應用程序安全系統。AppArmor是一個安全框架,通過強制執行良好的程序行為並防止甚至利用未知的軟件漏洞,可以主動包含操作系統和應用程序免受外部或內部威脅。AppArmor安全配置文件完全定義了各種程序可以訪問哪些系統資源以及具有哪些特權。AppArmor附帶了許多默認策略,並且結合了高級靜態分析和基於學習的工具。

AppArmor的特性包括:

1、完全整合。

2、易於部署。

3、AppArmor包括一整套控制檯和基於YaST的工具,可幫助開發,部署和維護應用程序安全策略。

4、通過執行適當的應用程序行為,保護操作系統,自定義應用程序和第三方應用程序免受外部和內部威脅。

5、報告和警報。內置功能使您可以安排詳細的事件報告並根據用戶定義的事件配置警報。

6、子流程限制。AppArmor允許您為單個Perl和PHP腳本定義安全策略,以提高Web服務器的安全性。

②SELinux

Security-Enhanced Linux(SELinux)是一種Linux功能,能夠為Linux內核提供各種安全策略。


SELinux的特性包括:

1、將策略和執行徹底分開

2、定義明確的策略接口

3、支持應用程序查詢策略並執行訪問控制

4、獨立於特定策略和策略語言

5、獨立於特定的安全標籤和內容

6、內核對象和服務單獨的標籤和控制

7、用於提效的訪問策略的緩存

8、支持策略變更

9、保護系統完整性和數據機密性的單獨措施

10、非常靈活的策略

11、控制流程的初始化和繼承以及程序執行

12、控制文件系統、目錄、文件和打開的文件描述符

13、控制套接字、消息和網絡接口

14、控制功能的使用


看完LXC這些特性,才瞭解Docker也是站在了巨人的肩膀之上

3、Seccomp策略

Seccomp是Linux內核提供的一種應用程序沙箱機制,Seccomp通過只允許應用程序調用指定的系統調用來達到沙箱的效果,Seccomp是用於過濾系統調用的非常有效的方法,當運行不受信的第三方程序時特別有用。

4、Chroots更改根目錄

Chroot(Change root directory)更改root目錄。在Linux系統中,系統默認的目錄結構都是以'/',即以根(root)開始的。而在使用chroot之後,系統的目錄結構將以指定的位置作為'/'位置。在經過chroot之後,系統讀取到的目錄和文件將不再是舊系統根下的而是新根下的目錄結構和文件,這樣做有3個好處:

①、增加了系統的安全性,限制了用戶的權力:

在經過 chroot 之後,在新根下將訪問不到舊系統的根目錄結構和文件,這樣就增強了系統的安全性。這個一般是在登錄 (login) 前使用 chroot,以此達到用戶不能訪問一些特定的文件。


②、建立一個與原系統隔離的系統目錄結構,方便用戶的開發:

使用 chroot 後,系統讀取的是新根下的目錄和文件,這是一個與原系統根下文件不相關的目錄結構。在這個新的環境中,可以用來測試軟件的靜態編譯以及一些與系統不相關的獨立開發。


③、切換系統的根目錄位置,引導 Linux 系統啟動以及急救系統等。

chroot 的作用就是切換系統的根位置,而這個作用最為明顯的是在系統初始引導磁盤的處理過程中使用,從初始 RAM 磁盤 (initrd) 切換系統的根位置並執行真正的 init。另外,當系統出現一些問題時,我們也可以使用 chroot 來切換到一個臨時的系統。

5、Kernel capabilities內核功能

為了執行權限檢查,傳統UNIX是將進程分為兩類:特權進程(有效用戶ID為0,稱為超級用戶或root)以及

非特權進程(其有效用戶ID為非零)特權進程會繞過所有內核權限檢查,而非特權進程則要根據進程的憑據(通常是:有效的UID,有效的GID和補充組列表)接受完全的權限檢查。Linux Kernel從2.2版本開始,提供了Capabilities 功能,它把特權劃分成不同單元,可以只授權程序所需的權限,而非所有特權,每個功能都可以獨立的啟用和禁用。

6、CGroups(control groups,控制組)

Cgroups是Linux內核提供的一種機制,為系統資源管理提供一個統一的框架。可以把系統任務及其子任務整合到按資源等級劃分的不同任務組內。Cgroups 可以限制、記錄、隔離進程組所使用的物理資源(包括:CPU、內存、IO等),是構建Docker等一系列虛擬化管理工具的基石。Cgroup有如下四個特點:

①、Cgroups的API以一個偽文件系統的方式實現,即用戶可以通過文件操作實現Cgroups的組織管理。

②、Cgroups的組織管理操作單元可以細粒度到線程級別,用戶態代碼也可以針對系統分配的資源創建和銷燬Cgroups,從而實現資源再分配和管理。

③、所有資源管理的功能都以“subsystem(子系統)”的方式實現,接口統一。

④、子進程創建之初與其父進程處於同一個Cgroups的控制組。


看完LXC這些特性,才瞭解Docker也是站在了巨人的肩膀之上


三、總結


在剛開始接觸Docker時,只知道Docker是也是一種虛擬機,但和傳統虛擬機不同的是,Docker是操作系統級別的虛擬化。Docker與Linux內核之間究竟是如何虛擬化的?今天通過這篇文章瞭解了。

LXC這個是虛擬化的基礎,更深層次的原理就是Linux內核本身提供的多種技術能夠支持實現操作系統級別的虛擬化,最終實現了Docker這種輕量級的,能夠改變軟件交付的容器技術。


看完LXC這些特性,才瞭解Docker也是站在了巨人的肩膀之上

簡介:一個在微服務、DevOps、雲原生領域不斷積累、不斷深耕的老碼農,您的每一個點贊都是我繼續下去的動力,歡迎關注交流。


分享到:


相關文章: