linux ContAIners (LXC)是一种操作系统级虚拟化方法,用于使用单个Linux内核在控制主机上运行多个独立的Linux系统(容器)。
Linux内核提供了cgroups功能,允许在不需要启动任何虚拟机的情况下对资源(CPU、内存、块 I/O、网络等)进行限制和优先排序,还提供了名称空间隔离功能,允许完全隔离应用程序对操作环境的视图,包括进程树、网络、用户 ID和挂载的文件系统。
LXC结合了内核的cgroup和对隔离名称空间的支持,为应用程序提供了一个隔离的环境。早期版本的Docker使用LXC作为容器执行驱动程序,尽管LXC在v0.9中是可选的,并且在Docker v1.10中放弃了支持。对Linux容器的引用通常指运行在Linux上的Docker容器的引用。
LXC使用以下内核特性来来实现虚拟化:
其中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目录都会被改变。
LXC是所谓的操作系统层次的虚拟化技术,与传统的HAL(硬件抽象层)层次的虚拟化技术相比有以下优势:
➤ 更小的虚拟化开销(LXC的诸多特性基本由内核特供,而内核实现这些特性只有极少的花费)。
➤ 快速部署。利用LXC来隔离特定应用,只需要安装LXC,即可使用LXC相关命令来创建并启动容器来为应用提供虚拟执行环境。传统的虚拟化技术则需要先创建虚拟机,然后安装系统,再部署应用。
LXC跟其他操作系统层次的虚拟化技术相比,最大的优势在于LXC被整合进内核,不用单独为内核打补丁。