1.
2.
刚才我们了解了 docker 的分层镜像系统和它的实现原理 aufs。 但其实 docker 的分层文件系统有很多的实现方式,aufs 只是其中一种。
它是 docker 最早期实现的 storge driver,也是目前最稳定的存储驱动。 但它有一个很不爽的缺线就是 aufs 一直没能进入 linux
内核的主干。 也就导致了很多 linux 的发行版是不支持 aufs 的。 例如我们最常用的 centos。 早期的 docker 只能运行在 ubantu
上。据说是因为 aufs 的代码写的实在太烂,linux 的作者一直坚决的反对把 aufs 添加到内核主干来。 但是大家对于 docker
的使用越来越迫切, 这时候 linux 社区的大牛们出马使用 device mapper 支持了 docker 的分层镜像系统。 之后我还会介绍 overlayFS 和
overlayFS2, 但他们都是对 aufs 的模仿,实现的都是 docker 的分层镜像系统。所以我就不再具体介绍他们原理了。 这里先简单介绍一下
device mapper, linux 运维的同学一定对它不陌生,lvm 逻辑卷的主要实现技术。
通过快照的方式备份数据,以前很多数据库的热备都是通过类似这样的技术实现的。快照的特点也是只对原始数据修改的部分做记录,而不是
真正的修改原始数据。 这一点跟 AUFS 一样,这样 device mapper 也就可以跟 aufs 一样去制作一个分层镜像系统。 device mapper
的优点是支持几乎所有 linux 的发行版本。它弥补了 aufs 只能在 ubantu 上运行的缺陷,让很多使用者可以很 happy 的在 centos
上安装并使用 docker。 但是它的缺点也是很令人诟病的。 device mapper
在构建自己的存储设备的时候是通过下面这个流程(图画的实在太 low 了请大家见谅):
首先会先创建一个空文件 A(docker 默认创建一个 100G 的空文件), 这个文件有 100G 大,但实际上是一个空文件。
然后创建一个本地回环设备 loopback0, 这个设备的特点是可以关联这个空文件 A,并且可以把这个 loopback0 挂载出一个设备 B。
这样任何对 B 的改动都会通过 loopback0 保存在这个文件 A 中。 这就是 device mapper 做实际存储的方式
(时间有点久了具体细节有点记不起来)。 这种机制有两个主要的缺点
一开始的那个空文件 A 是固定大小的,一旦创建没有任何扩容的可能。docker 默认创建的是 100G
大小的空间。如果随着使用的增加,我们的容器和镜像越来越多,100G 的硬盘空间极可能是不够的。
如果发生了这种情况,没有任何办法。只能 rm -r /var/lib/docker 来解决,也就是整个把 docker
干掉再通过事先创建文件和回环设备的方式扩容。 我们曾经经历过这种痛,这也是我们放弃 device mapper 的原因之一。
这种实现方式依赖本地回环设备进行 io 读写。 这种方式是不稳定的,在 google 查看过很多人的评论,都说 device mapper 的 io
不稳定,负载高。
还有一些其他的缺点我没有太关注,但是光这两个原因就足以让我放弃 device mapper 了。
overlayFS
由于大家对 device mapper 的失望,所以新一代的联合文件系统 overlayFS 问世。它可以说是 aufs 的升级版, 并且成功进入 linux
内核主干。 这里面有个小插曲,网上曾经流传着一封给 linux 作者的邮件,希望将 overlayFS 加入到 linux 中,
回复的邮件说中说虽然我也不喜欢 overlayFS,但它总比 aufs 好太多了,考虑到大多数人的需要,我决定把它加入到 linux 内核中来 (这是对
aufs 有多大的怨念啊 )。 overlayFS 作为 aufs 的升级版,他们实现的功能是一样的,架构也很像。