简单介绍Namespace、CGroups及AFUS

写在前面

如何用一个例子上手docker》这篇文章里通过一个例子上手Docker的基本使用,大家应该对Docker的使用有了一个基础的认识。那么,Docker这么牛x的东西,使用了哪些技术实现的呢?

严格意义上来说,Docker并不是一门新的技术,而是几种虚拟化技术的结合;或者说是Docker的存在,使得几种虚拟化技术的使用更简单,这才掀起了一阵不小的容器浪潮。

Namespace、CGroup与AUFS

Linux中的Namespace技术

linux中的Namespace是Kernel中用来分割内核资源的一个特性功能。命名空间A中的进程看到的资源与命名空间B中的进程看到的资源是不一样的。主要作用是隔离一系列的系统资源,比如PID(Process ID)、用户空间、网络等。

LInux的Namespace分不同的种类,有 Mount (2.4.19)、UTS (2.6.19)、IPC (2.6.19)、PID (2.6.24)、Network (2.6.29)、User (3.8)等几种(括号中为引入的版本号),而且各自在Linux内核中引入的时间是不一样的。

这就使得在新声明一个进程P时,如果只指定了CLONE_NEWPID的命名空间,那么Mount、Network、UTS等维度的资源进程P所看到的与父进程所看到的是一致的。如果想声明一个洁净的环境,可以通过 CLONE_NEWPID|CLONE_NEWUTS|CLONE_NEWIPC...类似的方式显式指定,这时候生成的子进程P1只能看到自己的资源,看不到父进程所在命名空间的资源了;假如父进程用相同的方法创建了子进程P2,P1与P2之间逻辑上也是隔离互不可见的。

Linux中的CGroup技术

使用Linux的Namespace技术从逻辑上为新创建的进程隔离了各种资源,但是新创建的进程共享同一份物理资源,比如CPU、内存、网络等。大家使用同一份资源,如果不加限制就有可能所有的资源(比如CPU)被同一个命名空间的进程耗尽,这就失去命名空间的意义了。

好在有Control Groups(简称CGroups)技术。

基本上可以这么理解CGroups:一个CGroups就像是一个资源池,可以为它增加不同维度的资源限制(比如cpu时间、内存大小等);加入到这个资源池中的进程,在申请资源时都会首先检查配额,相对于资源限定值是否有空闲的资源,有则获取得到资源,没有则等待直至其他进程释放资源然后获取资源。

AUFS

aufs的全称是advanced multi-layered unification filesystem,主要的功能是把多个文件夹的内容合并到一起,提供一个统一的视图。简单来讲,就是把不同物理位置的目录合并到同一个目录中。

AUFS有几个特点:

了解了AUFS的几个特点后,基本上Docker镜像的一些特点也就显而易见了。

小结

本文主要介绍了Docker中的三项主要技术:Namespace、CGroups以及AUFS。了解了基本原理,就能自然而然地理解容器的运行机制,应该能更好地理解它的使用。

受篇幅的影响,本文的内容只讲了大体的思路,可以考虑浏览参考中的文章试着挖掘更为具体的实现细节。

参考