作者:傅寬,單位:中國移動智慧家庭運營中心
容器是一個隔離的環(huán)境,可促進微服務(wù)并提供卓越的擴展性和快速部署等優(yōu)勢。本文介紹LXC(Linux容器)的特性、原理和應(yīng)用范圍。
1、LXC是什么?
Linux Containers (LXC)是一種操作系統(tǒng)級虛擬化方法,用于使用單個Linux內(nèi)核在控制主機上運行多個獨立的Linux系統(tǒng)(容器)。
圖1? 容器示意圖
2、邏輯管線執(zhí)行LXC可以做什么?
Linux內(nèi)核提供了cgroups功能,允許在不需要啟動任何虛擬機的情況下對資源(CPU、內(nèi)存、塊 I/O、網(wǎng)絡(luò)等)進行限制和優(yōu)先排序,還提供了名稱空間隔離功能,允許完全隔離應(yīng)用程序對操作環(huán)境的視圖,包括進程樹、網(wǎng)絡(luò)、用戶 ID和掛載的文件系統(tǒng)。
LXC結(jié)合了內(nèi)核的cgroup和對隔離名稱空間的支持,為應(yīng)用程序提供了一個隔離的環(huán)境。早期版本的Docker使用LXC作為容器執(zhí)行驅(qū)動程序,盡管LXC在v0.9中是可選的,并且在Docker v1.10中放棄了支持。對Linux容器的引用通常指運行在Linux上的Docker容器的引用。
3、LXC實現(xiàn)原理
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的結(jié)合使用,實現(xiàn)了文件系統(tǒng)的隔離。在啟動容器的時候,首先clone出一個容器進程,clone指定了CLONE_NEWNS標致,這樣就會為這個新啟動的容器創(chuàng)建一個新的mount namespace,結(jié)果使這個容器有一個新的文件層次視圖,在clone過程中,子進程會復(fù)制父進程的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/<container>/rootfs時(注:不能將一個目錄掛載到根目錄/,所以要調(diào)用系統(tǒng)接口pivot_root),對容器外其他進程而言是不可見的,容器外進程的root仍為之前的root而不是/var/lib/lxc/<container>/rootfs。比如,容器中的進程訪問/var與容器外進程訪問/var其實是不同的/var, 容器中進程訪問的實際是/var/lib/lxc/<container>/rootfs/var。換句話說,如果clone時不指定CLONE_NEWNS,這樣當容器執(zhí)行pivot_root時,會影響到容器之外的所有進程,容器外的所有進程的root目錄都會被改變。
4、為什么要選擇LXC?
LXC是所謂的操作系統(tǒng)層次的虛擬化技術(shù),與傳統(tǒng)的HAL(硬件抽象層)層次的虛擬化技術(shù)相比有以下優(yōu)勢:
? 更小的虛擬化開銷(LXC的諸多特性基本由內(nèi)核特供,而內(nèi)核實現(xiàn)這些特性只有極少的花費)。
? 快速部署。利用LXC來隔離特定應(yīng)用,只需要安裝LXC,即可使用LXC相關(guān)命令來創(chuàng)建并啟動容器來為應(yīng)用提供虛擬執(zhí)行環(huán)境。傳統(tǒng)的虛擬化技術(shù)則需要先創(chuàng)建虛擬機,然后安裝系統(tǒng),再部署應(yīng)用。
LXC跟其他操作系統(tǒng)層次的虛擬化技術(shù)相比,最大的優(yōu)勢在于LXC被整合進內(nèi)核,不用單獨為內(nèi)核打補丁。