作者:傅寬,單位:中國移動智慧家庭運營中心
容器是一個隔離的環(huán)境,可促進微服務并提供卓越的擴展性和快速部署等優(yōu)勢。本文介紹LXC(Linux容器)的特性、原理和應用范圍。
Linux Containers (LXC)是一種操作系統(tǒng)級虛擬化方法,用于使用單個Linux內(nèi)核在控制主機上運行多個獨立的Linux系統(tǒng)(容器)。

圖1? 容器示意圖
Linux內(nèi)核提供了cgroups功能,允許在不需要啟動任何虛擬機的情況下對資源(CPU、內(nèi)存、塊 I/O、網(wǎng)絡等)進行限制和優(yōu)先排序,還提供了名稱空間隔離功能,允許完全隔離應用程序對操作環(huán)境的視圖,包括進程樹、網(wǎng)絡、用戶 ID和掛載的文件系統(tǒng)。
LXC結合了內(nèi)核的cgroup和對隔離名稱空間的支持,為應用程序提供了一個隔離的環(huán)境。早期版本的Docker使用LXC作為容器執(zhí)行驅動程序,盡管LXC在v0.9中是可選的,并且在Docker v1.10中放棄了支持。對Linux容器的引用通常指運行在Linux上的Docker容器的引用。
LXC使用以下內(nèi)核特性來來實現(xiàn)虛擬化:
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的結合使用,實現(xiàn)了文件系統(tǒng)的隔離。在啟動容器的時候,首先clone出一個容器進程,clone指定了CLONE_NEWNS標致,這樣就會為這個新啟動的容器創(chuàng)建一個新的mount namespace,結果使這個容器有一個新的文件層次視圖,在clone過程中,子進程會復制父進程的mount namespace,mount namespace的作用主要是體現(xiàn)在mount與umount(其實還有pivot_root)上面,由于具有不同的文件層次圖,每一個mount namespace中的mount、umount與pivot_root操作對其他mount namespace中的進程是不可見的,這樣在容器啟動過程中執(zhí)行pivot_root操作將當前容器進程的root切換為/var/lib/lxc/
LXC是所謂的操作系統(tǒng)層次的虛擬化技術,與傳統(tǒng)的HAL(硬件抽象層)層次的虛擬化技術相比有以下優(yōu)勢:
? 更小的虛擬化開銷(LXC的諸多特性基本由內(nèi)核特供,而內(nèi)核實現(xiàn)這些特性只有極少的花費)。
? 快速部署。利用LXC來隔離特定應用,只需要安裝LXC,即可使用LXC相關命令來創(chuàng)建并啟動容器來為應用提供虛擬執(zhí)行環(huán)境。傳統(tǒng)的虛擬化技術則需要先創(chuàng)建虛擬機,然后安裝系統(tǒng),再部署應用。
LXC跟其他操作系統(tǒng)層次的虛擬化技術相比,最大的優(yōu)勢在于LXC被整合進內(nèi)核,不用單獨為內(nèi)核打補丁。