Part 01、 LXC是什么
linux ContAIners (LXC)是一種操作系統級虛擬化方法,用于使用單個Linux內核在控制主機上運行多個獨立的Linux系統(容器)。
Part 02、 邏輯管線執行LXC可以做什么?
Linux內核提供了cgroups功能,允許在不需要啟動任何虛擬機的情況下對資源(CPU、內存、塊 I/O、網絡等)進行限制和優先排序,還提供了名稱空間隔離功能,允許完全隔離應用程序對操作環境的視圖,包括進程樹、網絡、用戶 ID和掛載的文件系統。
LXC結合了內核的cgroup和對隔離名稱空間的支持,為應用程序提供了一個隔離的環境。早期版本的Docker使用LXC作為容器執行驅動程序,盡管LXC在v0.9中是可選的,并且在Docker v1.10中放棄了支持。對Linux容器的引用通常指運行在Linux上的Docker容器的引用。
Part 03、 LXC實現原理
LXC使用以下內核特性來來實現虛擬化:
- Kernel namespaces (ipc, uts, mount, pid,.NETwork and user)
- Apparmor and SELinux profiles
- Seccomp policies
- Chroots (using pivot_root)
- Kernel capabilities Control groups (cgroups)
其中mount namespace與pivot_root的結合使用,實現了文件系統的隔離。在啟動容器的時候,首先clone出一個容器進程,clone指定了CLONE_NEWNS標致,這樣就會為這個新啟動的容器創建一個新的mount namespace,結果使這個容器有一個新的文件層次視圖,在clone過程中,子進程會復制父進程的mount namespace,mount namespace的作用主要是體現在mount與umount(其實還有pivot_root)上面,由于具有不同的文件層次圖,每一個mount namespace中的mount、umount與pivot_root操作對其他mount namespace中的進程是不可見的,這樣在容器啟動過程中執行pivot_root操作將當前容器進程的root切換為/var/lib/lxc/<container>/rootfs時(注:不能將一個目錄掛載到根目錄/,所以要調用系統接口pivot_root),對容器外其他進程而言是不可見的,容器外進程的root仍為之前的root而不是/var/lib/lxc/<container>/rootfs。比如,容器中的進程訪問/var與容器外進程訪問/var其實是不同的/var, 容器中進程訪問的實際是/var/lib/lxc/<container>/rootfs/var。換句話說,如果clone時不指定CLONE_NEWNS,這樣當容器執行pivot_root時,會影響到容器之外的所有進程,容器外的所有進程的root目錄都會被改變。
Part 04、 為什么要選擇LXC?
LXC是所謂的操作系統層次的虛擬化技術,與傳統的HAL(硬件抽象層)層次的虛擬化技術相比有以下優勢:
? 更小的虛擬化開銷(LXC的諸多特性基本由內核特供,而內核實現這些特性只有極少的花費)。
? 快速部署。利用LXC來隔離特定應用,只需要安裝LXC,即可使用LXC相關命令來創建并啟動容器來為應用提供虛擬執行環境。傳統的虛擬化技術則需要先創建虛擬機,然后安裝系統,再部署應用。
LXC跟其他操作系統層次的虛擬化技術相比,最大的優勢在于LXC被整合進內核,不用單獨為內核打補丁。