Docker 17
引擎 | Engine

使用ZFS存储驱动程序(引擎) | Use the ZFS storage driver (Engine)

使用ZFS存储驱动程序

ZFS是下一代文件系统,支持许多高级存储技术,如卷管理,快照,校验和,压缩和重复数据删除,复制等。

它由Sun Microsystems(现在是Oracle Corporation)创建,并且根据CDDL许可证开源。由于CDDL和GPL之间的许可不兼容,ZFS不能作为主线Linux内核的一部分发货。但是,ZFS On Linux(ZoL)项目提供了可以单独安装的树外内核模块和用户空间工具。

Linux(ZoL)端口上的ZFS健康且成熟。但是,目前不推荐使用zfsDocker存储驱动程序进行生产使用,除非您在Linux上拥有丰富的ZFS经验。

注意:在Linux平台上还有一个ZFS的FUSE实现。这不被推荐。本地ZFS驱动程序(ZoL)经过更多测试,性能更高,使用更广泛。本文档的其余部分涉及本地ZoL端口。

先决条件

  • ZFS需要一个或多个专用块设备,最好是固态驱动器(SSD)。

使用zfs存储驱动程序配置Docker

  • 停止Docker。

管理 zfs

增加正在运行的设备的容量

要增加大小zpool,您需要将专用块设备添加到Docker主机,然后将其添加到zpool使用zpool add命令:

$ sudo zpool add zpool-docker /dev/xvdh

限制容器的可写入存储配额

如果要基于每个image?dataset集实现配额,可以设置size存储选项以限制单个容器可用于其可写层的空间量。

编辑/etc/docker/daemon.json并添加以下内容:

{ "storage-driver": "zfs", "storage-opts": ["size=256M"] }

查看每个存储驱动程序的所有存储选项:

  • Stable

保存并关闭文件,然后重新启动Docker。

如何zfs存储驱动程序作品

ZFS使用以下对象:

  • 文件系统:精简配置,zpool按需分配空间。

创建一个克隆的过程:

  • 从文件系统创建只读快照。

文件系统,快照和克隆都从底层分配空间zpool

映像和容器层在磁盘上

每个正在运行的容器的统一文件系统都安装在一个安装点上/var/lib/docker/zfs/graph/。继续阅读以获得关于统一文件系统组成的解释。

图像分层和共享

图像的基础层是ZFS文件系统。每个子图层都是基于ZFS下方图层的ZFS快照。容器是基于ZFS快照的ZFS快照,该ZFS快照是从创建映像的顶层开始的。

下图显示了如何将这与基于双层图像的正在运行的容器放在一起。

当你启动一个容器时,以下步骤按顺序进行:

  • 图像的基础层作为ZFS文件系统存在于Docker主机上。

容器读取和写入的工作方式 zfs

读取文件

每个容器的可写层都是一个ZFS克隆,它将其所有数据与其创建的数据集(其父层的快照)共享。即使正在读取的数据来自深层,读操作也是最快的。该图说明了块共享的工作方式:

编写文件

编写一个新文件:根据需要从底层分配空间zpool,并将块直接写入容器的可写层。

修改现有文件:只为已更改的块分配空间,并使用写时复制(CoW)策略将这些块写入容器的可写层。这可以最大限度地减小图层的大小并提高写入性能。

删除文件或目录

  • 当删除存在于较低层的文件或目录时,即使文件或目录仍然存在于较低的只读层中,ZFS驱动程序也会掩盖该容器可写层中的文件或目录的存在。

ZFS和Docker性能

有几个因素会影响Docker使用zfs存储驱动程序的性能。

  • 内存内存对ZFS性能有重大影响。ZFS最初设计用于具有大量内存的大型企业级服务器。

性能最佳实践

  • 使用快速存储:固态硬盘(SSD)比旋转磁盘提供更快的读取和写入速度。

容器存储驱动程序ZFS