非常教程

Docker 17参考手册

引擎 | Engine

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

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仅支持泊坞CE与Ubuntu 14.04或更高版本,与zfs包(16.04及更高版本)或zfs-nativeubuntu-zfs已安装的软件包(14.04)。
    • 对于Ubuntu 14.04,您需要先启用补充软件包存储库,ppa:zfs-native/stable然后才能安装软件包。有关说明,请参阅https://launchpad.net/~zfs-native/+archive/ubuntu/stable。
  • Docker EE或CS-Engine或任何其他Linux平台不支持ZFS。
  • /var/lib/docker/目录必须安装在ZFS格式的文件系统上。
  • 更改存储驱动程序将使您已创建的任何容器在本地系统上都不可访问。使用docker save保存的容器,并推动现有图像多克尔集线器或私人仓库,让你不必后重新创建它们。

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

  1. 停止Docker。
  2. 将内容复制/var/lib/docker//var/lib/docker.bk并删除内容/var/lib/docker/。$ sudo cp -au /var/lib/docker /var/lib/docker.bk $ sudo rm -rf /var/lib/docker/*
  3. zpool在您的专用块设备或设备上创建一个新的,并将其安装到/var/lib/docker/。确保你已经指定了正确的设备,因为这是一个破坏性的操作。此示例将两个设备添加到池中。$ sudo zpool create -f zpool-docker -m /var/lib/docker /dev/xvdf /dev/xvdg该命令创建zpool并命名它zpool-docker。该名称仅用于显示目的,您可以使用不同的名称。检查池是否使用正确创建和安装zfs list。$ sudo zfs list NAME USED AVAIL REFER MOUNTPOINT zpool-docker 55K 96.4G 19K /var/lib/docker
  4. 配置Docker以使用zfs。编辑/etc/docker/daemon.json并设置storage-driverzfs。如果该文件之前为空,它现在应该如下所示:{“storage-driver”:“zfs”}保存并关闭文件。
  5. 启动Docker。使用docker info验证存储驱动程序zfs。$ sudo docker信息容器:0正在运行:0已暂停:0已停止:0图像:0服务器版本:17.03.1-ce存储驱动程序:zfs Zpool:zpool-docker Zpool运行状况:ONLINE父数据集:zpool-docker父级使用的空间:249856可用空间:103498395648父配额:否压缩:关闭<output truncated>

管理 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
  • Edge

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

如何zfs存储驱动程序作品

ZFS使用以下对象:

  • 文件系统:精简配置,zpool按需分配空间。
  • 快照:文件系统的只读空间有效时间点拷贝。
  • 克隆:快照的读写副本。用于存储与上一层的差异。

创建一个克隆的过程:

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

  1. 从文件系统创建只读快照。
  2. 从快照创建可写克隆。这包含与父层的任何差异。

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

映像和容器层在磁盘上

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

图像分层和共享

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

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

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

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

  1. 图像的基础层作为ZFS文件系统存在于Docker主机上。
  2. 其他图像层是直接位于其下方的图像层的数据集的克隆。在该图中,通过获取基础层的ZFS快照并从该快照创建克隆来添加“第1层”。该克隆是可写的,并从zpool消耗按需空间。快照是只读的,将基本层保持为不可变对象。
  3. 当容器启动时,图像上方会添加一个可写图层。在该图中,容器的读写层是通过制作图像顶层(第1层)的快照并从该快照创建克隆来创建的。
  4. 当容器修改其可写层的内容时,将为已更改的块分配空间。默认情况下,这些块是128k。

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

读取文件

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

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

编写文件

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

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

删除文件或目录

  • 当删除存在于较低层的文件或目录时,即使文件或目录仍然存在于较低的只读层中,ZFS驱动程序也会掩盖该容器可写层中的文件或目录的存在。
  • 如果您创建并删除容器可写层中的文件或目录,则块将被回收zpool

ZFS和Docker性能

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

  • 内存:内存对ZFS性能有重大影响。ZFS最初设计用于具有大量内存的大型企业级服务器。
  • ZFS特性:ZFS包含重复数据删除功能。使用此功能可能会节省磁盘空间,但会占用大量内存。建议您停用zpoolDocker使用的此功能,除非您使用SAN,NAS或其他硬件RAID技术。
  • ZFS缓存:ZFS将磁盘块缓存在称为自适应替换缓存(ARC)的内存结构中。ZFS 的Single Copy ARC功能允许一个块的单个缓存副本由a的多个克隆共享使用此功能,多个运行中的容器可以共享一个缓存块的单个副本。此功能使ZFS成为PaaS和其他高密度用例的理想选择。
  • 碎片:碎片是ZFS等写入时复制文件系统的自然副产品。ZFS通过使用128k的小块来缓解这种情况。ZFS意向日志(ZIL)和写入合并(延迟写入)也有助于减少碎片。您可以使用监视碎片zfs status。但是,如果不重新格式化和恢复文件系统,则无法对ZFS进行碎片整理。
  • 使用适用于Linux的本机ZFS驱动程序:由于性能较差,不建议使用ZFS FUSE实施。

性能最佳实践

  • 使用快速存储:固态硬盘(SSD)比旋转磁盘提供更快的读取和写入速度。
  • 将卷用于写入繁重的工作负载:卷为写入繁重的工作负载提供最佳和最可预测的性能。这是因为它们绕过了存储驱动程序,并且不会产生精简配置和写入时复制引入的任何潜在开销。卷还有其他好处,例如允许您在容器之间共享数据,并且即使在没有正在运行的容器正在使用它们时也会持久存在。

容器,存储,驱动程序,ZFS

引擎 | Engine相关

1..NET核心应用程序(引擎) | .NET Core application (Engine)
2.关于图像,容器和存储驱动程序(引擎) | About images, containers, and storage drivers (Engine)
3.向swarm添加节点(Engine) | Add nodes to the swarm (Engine)
4.应用自定义元数据(引擎) | Apply custom metadata (Engine)
5.应用滚动更新(引擎) | Apply rolling updates (Engine)
6.apt-cacher-ng
7.编写Dockerfiles(引擎)的最佳实践 | Best practices for writing Dockerfiles (Engine)
8.二进制(引擎) | Binaries (Engine)
9.将容器端口绑定到主机(引擎) | Bind container ports to the host (Engine)
10.突破性变化(引擎) | Breaking changes (Engine)
11.建立自己的网桥 | Build your own bridge (Engine)
12.CentOS (Engine)
13.CentOS (Engine)
14.配置容器DNS(引擎) | Configure container DNS (Engine)
15.在用户定义的网络中配置容器DNS(引擎) | Configure container DNS in user-defined networks (Engine)
16.CouchDB (Engine)
17.创建基本映像(引擎) | Create a base image (Engine)
18.创建群(引擎) | Create a swarm (Engine)
19.自定义docker0网桥(引擎) | Customize the docker0 bridge (Engine)
20.Debian (Engine)
21.默认桥接网络 | Default bridge network
22.删除服务(引擎) | Delete the service (Engine)
23.部署服务(引擎) | Deploy a service (Engine)
24.将服务部署到一个群(引擎) | Deploy services to a swarm (Engine)
25.不推荐的引擎功能 | Deprecated Engine features
26.Docker容器网络(引擎) | Docker container networking (Engine)
27.Docker概述(引擎) | Docker overview (Engine)
28.Docker运行参考(引擎) | Docker run reference (Engine)
29.Dockerfile引用(引擎) | Dockerfile reference (Engine)
30.Dockerize应用程序 | Dockerize an application
31.排空节点(引擎) | Drain a node (Engine)
32.引擎 | Engine
33.FAQ(引擎) | FAQ (Engine)
34.Fedora (Engine)
35.开始 | Get started (Engine)
36.开始使用macvlan网络驱动程序 | Get started with macvlan network driver (Engine)
37.开始使用多主机网络 | Get started with multi-host networking (Engine)
38.节点如何工作 | How nodes work (Engine)
39.服务如何运作(引擎) | How services work (Engine)
40.图像管理 | Image management (Engine)
41.检查服务(引擎) | Inspect the service (Engine)
42.安装Docker(引擎) | Install Docker (Engine)
43.IPv6与Docker(引擎) | IPv6 with Docker (Engine)
44.将节点加入群集(引擎) | Join nodes to a swarm (Engine)
45.旧容器链接(引擎) | Legacy container links (Engine)
46.锁定你的群(引擎) | Lock your swarm (Engine)
47.管理群中的节点(引擎) | Manage nodes in a swarm (Engine)
48.使用Docker机密管理敏感数据(引擎) | Manage sensitive data with Docker secrets (Engine)
49.使用PKI管理swarm安全性(引擎) | Manage swarm security with PKI (Engine)
50.管理群体服务网络(引擎) | Manage swarm service networks (Engine)
51.迁移到引擎1.10 | Migrate to Engine 1.10
52.可选的Linux安装后步骤(引擎) | Optional Linux post-installation steps (Engine)
53.总览 | Overview (Engine)
54.总览 | Overview (Engine)
55.PostgreSQL(引擎) | PostgreSQL (Engine)
56.群集模式中的筏共识(引擎) | Raft consensus in swarm mode (Engine)
57.Riak (Engine)
58.以群集模式运行Docker Engine | Run Docker Engine in swarm mode
59.扩展服务(引擎) | Scale the service (Engine)
60.SDKs (Engine)
61.选择一个存储驱动 | Select a storage driver (Engine)
62.设置教程(引擎) | Set up for the tutorial (Engine)
63.SSHd (Engine)
64.存储驱动总览 | Storage driver overview (Engine)
65.存储服务配置数据(引擎) | Store service configuration data (Engine)
66.Swarm管理指南(引擎) | Swarm administration guide (Engine)
67.Swarm模式关键概念(引擎) | Swarm mode key concepts (Engine)
68.Swarm模式覆盖网络安全模型(引擎) | Swarm mode overlay network security model (Engine)
69.群模式概述(引擎) | Swarm mode overview (Engine)
70.Ubuntu (Engine)
71.Ubuntu (Engine)
72.了解容器通信(引擎) | Understand container communication (Engine)
73.使用多阶段构建(引擎) | Use multi-stage builds (Engine)
74.使用swarm模式路由网格(引擎) | Use swarm mode routing mesh (Engine)
75.使用AUFS存储驱动程序(引擎) | Use the AUFS storage driver (Engine)
76.使用Btrfs存储驱动程序(引擎) | Use the Btrfs storage driver (Engine)
77.使用设备映射器存储驱动程序(引擎) | Use the Device mapper storage driver (Engine)
78.使用OverlayFS存储驱动程序(引擎) | Use the OverlayFS storage driver (Engine)
79.使用VFS存储驱动程序(引擎) | Use the VFS storage driver (Engine)
80.处理图像 | Work with images
81.使用网络命令(引擎) | Work with network commands (Engine)
Docker 17

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

主页 https://docker.com/
源码 https://github.com/docker/docker
版本 17
发布版本 17.06