关于Docker存储驱动

最近稍微梳理了一些关于docker存储驱动方面的知识。记录下来,方便以后进行回顾。

Docker的存储驱动目前分为五种。分别是以下几种:

  • Overlay
  • DeviceMapper
  • AUFS
  • Btrfs
  • ZFS

在最早期的版本中,Docker只支持AUFS文件系统,也由于AUFS的设计理念,使得Docker支持文件系统分层分层。所谓分层,就是指文件系统是一层一层地叠加上去。然后AUFS只支持UBUNTU,考虑到兼容性的问题,Docker在0.7以后的版本中,引入了存储驱动。没有任何一个单一的存储驱动适用于所有的场景。在实际使用中,要根据需求选择合适的存储驱动。

1. AUFS

AUFS(Another Union File System),顾名思义,另一个联合文件系统,是一种Union FS。它作为文件级的存储驱动,支持把多层文件系统合并成单层表示,通俗地说,就是文件系统一层一层地叠加。只有最上层的文件系统是可进行读写的,下层的所有文件系统都是只读的。如果要对已有的文件进行修改操作,AUFS会将目标文件从下面的只读层复制到上面的读写层,修改完后,只读层的原文件会被新文件隐藏。新文件依旧还是在可写层。

AUFS结构

2. Overlay

Overlay于2014年在Docker引擎中发行。Overlay是一个联合文件系统,也是一种文件级存储。它的设计理念和AUFS相比更为简单,AUFS文件系统有多层,Overlay只有两层,分别为lower-dir和upper层,lower层对应只读的镜像层,upeer层对应容器运行时的读写层。另外,还有一个merged-dir用于文件系统合并视图。由于下面只有一个low-dir,所以当对已存在的镜像添加新的文件层时,会对下面已有的lower-dir做一个递归嵌套,或者按照Docker的实现,将已存在的low-er层中的内容全部硬连接在low-er层中。这种方式不太优雅。在后续版本中,Docker又推出了Overlay2,通过利用更高内核(4.0版本及以上)来更优雅地实现分层机制。

Overlay结构

3. DeviceMapper

DeviceMapper于2013在Docker引擎中发行。提供一种从逻辑设备的物理设备的映射框架机制。DeviceMapper属于块级存储,所有的操作都是直接对块进行,而不是文件。DeviceMapper驱动会在块设备上创建一个资源池,然后在资源池上创建一个带有文件系统的块设备。这与之前提到的联合文件系统不同,DeviceMapper是基于块设备的,这使得计算分层之间的差别变得不那么容易,也丧失了相同镜像层的共享能力(有待考证)。DeviceMapper采取用时分配的策略,当启动一个容器时,并不会为它分配空间,而是需要的时候再分配。一般情况下,DeviceMapper驱动会默认创建一个100G的文件包含镜像和容器,每一个容器限制在10G大小的卷内,这些大小都可以进行修改。

DeviceMapper结构

4. Brtfs

Brtfs于2013年在Docker引擎中发行。(目前还没接触过,不太熟悉)

5. ZFS

ZFS于2014年被合并在Docker引擎里面。它是一个全新的文件系统,它抛弃了传统的卷管理方式,而是把所有设备几种到一个存储池进行管理。存储池由若干虚拟设备组成,这些虚拟设备可以是原始磁盘,也可以是一个DAID1镜像设备等等。存储池上的文件系统可以使用这些虚拟设备的总存储量。

ZFS结构


参考文章:
[1]: http://dockone.io/article/1513
[2]: http://dockone.io/article/1765