简单介绍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 是一种联合文件系统,它把若干目录按照顺序和权限 mount 为一个目录并呈现出来。
- 默认情况下,只有第一层(第一个目录)是可写的,其余层是只读的。
- 增加文件:默认情况下,新增的文件都会被放在最上面的可写层中。
- 删除文件:因为底下各层都是只读的,当需要删除这些层中的文件时,AUFS 使用 whiteout 机制,它的实现是通过在上层的可写的目录下建立对应的whiteout隐藏文件来实现的(现在知道在Dockerfile里增加一条删除语句最终镜像也不会变小的原因了吧)。
- 修改文件:AUFS 利用其 CoW (copy-on-write)特性来修改只读层中的文件。AUFS 工作在文件层面,因此,只要对只读层中的文件做修改,不管修改数据的量的多少,在第一次修改时,文件都会被拷贝到可写层然后再被修改。
- 节省空间:AUFS 的 CoW 特性能够允许在多个容器之间共享分层,从而减少物理空间占用。
- 查找文件:AUFS 的查找性能在层数非常多时会出现下降,层数越多,查找性能越低,因此,在制作 Docker 镜像时要注意层数不要太多。
- 性能:AUFS 的 CoW 特性在写入大型文件时第一次会出现延迟。
了解了AUFS的几个特点后,基本上Docker镜像的一些特点也就显而易见了。
小结
本文主要介绍了Docker中的三项主要技术:Namespace、CGroups以及AUFS。了解了基本原理,就能自然而然地理解容器的运行机制,应该能更好地理解它的使用。
受篇幅的影响,本文的内容只讲了大体的思路,可以考虑浏览参考中的文章试着挖掘更为具体的实现细节。
参考
- Docker 核心技术与实现原理 比较详细地较少docker所使用的技术
- 自己动手写Docker 这是一本书,把docker用golang重写了一遍;技术背景讲的不是很多,但是实践性很强的一本书。
- Linux namespaces - Wikipedia
- CGroup 介绍、应用实例及原理描述 介绍了CGroup的原理
- 理解Docker之Docker 存储 - AUFS