Docker存储驱动程序

预计阅读时间:10分钟

理想情况下,很少有数据写入容器的可写层,而您使用Docker卷来写入数据。但是,某些工作负载要求您能够写入容器的可写层。这是存储驱动程序进入的地方。

Docker使用可插拔架构支持几种不同的存储驱动程序。存储驱动程序控制在Docker主机上如何存储和管理映像和容器。

阅读存储驱动程序概述之后,下一步就是为您的工作负载选择最佳的存储驱动程序。在做出此决定时,需要考虑三个高层次的因素:

如果内核中支持多个存储驱动程序,则在未明确配置存储驱动程序的情况下,Docker会优先列出要使用的存储驱动程序,前提是该存储驱动程序满足先决条件。

在大多数情况下,请使用具有最佳整体性能和稳定性的存储驱动程序。

Docker支持以下存储驱动程序:

  • overlay2 是当前所有受支持的Linux发行版的首选存储驱动程序,并且不需要任何额外的配置。
  • aufs在不支持的内核3.13的Ubuntu 14.04上运行时,它是Docker 18.06和更早版本的首选存储驱动程序overlay2
  • fuse-overlayfs仅在不提供对rootless的支持的主机上运行Rootless Docker时才首选overlay2。在Ubuntu和Debian 10上,即使在无根模式下fuse-overlayfs也不需要使用该驱动程序overlay2。请参阅无根模式文档
  • devicemapper支持,但是direct-lvm对于生产环境是必需的,因为loopback-lvm零配置虽然性能很差。devicemapper是CentOS和RHEL的推荐存储驱动程序,因为它们的内核版本不支持overlay2。但是,当前版本的CentOS和RHEL现在支持overlay2,这是推荐的驱动程序。
  • 如果btrfszfs驱动程序是后备文件系统(安装了Docker的主机的文件系统),则使用它们。这些文件系统允许使用高级选项,例如创建“快照”,但需要更多的维护和设置。这些中的每一个都依赖于正确配置的后备文件系统。
  • vfs存储驱动程序的目的是为了进行测试,并在那里不能使用任何写入时复制文件系统的情况。此存储驱动程序的性能很差,通常不建议在生产中使用。

Docker的源代码定义了选择顺序。您可以在Docker Engine 20.10的源代码上看到订单

如果您运行其他版本的Docker,则可以使用文件查看器顶部的分支选择器来选择其他分支。

一些存储驱动程序要求您对备份文件系统使用特定格式。如果您有使用特定备份文件系统的外部要求,则可能会限制您的选择。请参阅支持的后备文件系统

在确定了可以选择的存储驱动程序之后,您的选择取决于工作负载的特征和所需的稳定性。请参阅其他注意事项, 以帮助您做出最终决定。

注意:您的选择可能会受您的操作系统和发行版的限制。例如,aufs仅在Ubuntu和Debian上受支持,并且可能需要安装额外的软件包,而btrfs仅在SLES上受支持,SLES仅受Docker Enterprise支持。有关 更多信息,请参见支持每个Linux发行版的存储驱动程序

每个Linux发行版支持的存储驱动程序

在较高级别上,可以使用的存储驱动程序部分取决于所使用的Docker版本。

此外,Docker不建议您使用任何配置来禁用操作系统的安全功能,例如,selinux如果您在CentOS上使用overlayoverlay2驱动程序,则需要禁用 该配置。

Docker Engine-社区

对于Docker Engine-Community,仅测试了某些配置,并且您操作系统的内核可能不支持每个存储驱动程序。通常,以下配置适用于最新版本的Linux发行版:

Linux发行版 推荐的存储驱动程序 替代驱动程序
Docker Engine-Ubuntu上的社区 overlay2aufs(对于在内核3.13上运行的Ubuntu 14.04) overlay¹,devicemapper² zfsvfs
Docker Engine-Debian上的社区 overlay2(Debian Stretch)aufsdevicemapper(旧版本) overlay¹, vfs
Docker Engine-CentOS上的社区 overlay2 overlay¹,devicemapper² zfsvfs
Docker Engine-Fedora上的社区 overlay2 overlay¹,devicemapper² zfsvfs

¹)overlay不推荐使用存储驱动程序,并将在以后的版本中将其删除。建议将overlay存储驱动程序的用户迁移到overlay2

²)devicemapper不推荐使用存储驱动程序,并将在以后的版本中将其删除。建议将devicemapper存储驱动程序的用户迁移到overlay2

笔记

上面的比较表不适用于无根模式。有关无根模式下可用的驱动程序,请参阅无根模式文档

可能的话,overlay2推荐使用存储驱动程序。首次安装Docker时,overlay2默认情况下使用。以前,aufs默认情况下会在可用时使用它,但情况已不再如此。如果要aufs在以后的新安装中使用,则需要对其进行显式配置,并且可能需要安装其他软件包,例如linux-image-extra。参见aufs

在使用的现有安装中aufs,仍会使用它。

如有疑问,最好的全方位配置是使用具有支持overlay2存储驱动程序的内核的现代Linux发行版,并使用Docker卷处理繁重的工作负载,而不是依赖于将数据写入容器的可写层。

vfs存储驱动程序通常不是最好的选择。在使用vfs 存储驱动程序之前,请务必阅读 其性能以及存储特性和限制

对不推荐使用的存储驱动程序的期望:Docker Engine-Community不提供商业支持,您可以从技术上使用适用于您平台的任何存储驱动程序。例如btrfs,即使不建议在Docker Engine-Community的任何平台上使用它,您也可以将其与Docker Engine-Community一起使用,但后果自负。

上表中的建议基于自动回归测试和已知适用于大量用户的配置。如果使用推荐的配置并发现可重现的问题,则很可能会很快解决该问题。如果根据该表不推荐您使用的驱动程序,则需要您自担风险。您可以并且仍然应该报告遇到的任何问题。但是,此类问题的优先级低于使用推荐配置时遇到的问题。

Mac的Docker桌面和Windows的Docker桌面

Mac的Docker桌面和Windows的Docker桌面仅用于开发,而不用于生产。无法在这些平台上修改存储驱动程序。

支持的后备文件系统

对于Docker,支持文件系统是所在的文件系统 /var/lib/docker/。一些存储驱动程序仅适用于特定的后备文件系统。

存储驱动 支持的后备文件系统
overlay2overlay xfs 在ftype = 1的情况下, ext4
fuse-overlayfs 任何文件系统
aufs xfsext4
devicemapper direct-lvm
btrfs btrfs
zfs zfs
vfs 任何文件系统

其他注意事项

适合您的工作量

除其他事项外,每个存储驱动程序都有其自己的性能特征,这使其或多或少地适合于不同的工作负载。考虑以下概括:

  • overlay2,,aufsoverlay都在文件级别而不是块级别运行。这样可以更有效地使用内存,但是在写繁重的工作负载中,容器的可写层可能会变得非常大。
  • 块级存储驱动器,例如devicemapperbtrfszfs更好地为写繁重的工作负担(虽然不是还有泊坞窗卷)执行。
  • 对于许多小型写入或具有多层或深文件系统的容器,其性能 overlay可能比更好overlay2,但会消耗更多的inode,这可能导致inode耗尽。
  • btrfszfs需要大量的内存。
  • zfs 对于高密度工作负载(例如PaaS)是一个不错的选择。

每个存储驱动程序的文档中提供了有关性能,适用性和最佳实践的更多信息。

共享存储系统和存储驱动程序

如果您的企业使用SAN,NAS,硬件RAID或其他共享存储系统,则它们可以提供高可用性,增强的性能,自动精简配置,重复数据删除和压缩。在许多情况下,Docker可以在这些存储系统上运行,但是Docker并未与其紧密集成。

每个Docker存储驱动程序均基于Linux文件系统或卷管理器。确保在共享存储系统之上遵循用于操作存储驱动程序(文件系统或卷管理器)的现有最佳实践。例如,如果在共享存储系统上使用ZFS存储驱动程序,请确保遵循最佳实践在该特定共享存储系统上操作ZFS文件系统。

稳定

对于某些用户而言,稳定性比性能更重要。尽管Docker认为这里提到的所有存储驱动程序都是稳定的,但其中一些是较新的并且仍在积极开发中。在一般情况下,overlay2aufsoverlay,和devicemapper与稳定性最高的选择。

用您自己的工作负载进行测试

您可以在不同的存储驱动程序上运行自己的工作负载时测试Docker的性能。确保使用等效的硬件和工作负载来匹配生产条件,以便您可以看到哪个存储驱动程序提供最佳的整体性能。

检查您当前的存储驱动程序

每个单独的存储驱动程序的详细文档详细说明了使用给定存储驱动程序的所有设置步骤。

要查看Docker当前正在使用什么存储驱动程序,请使用docker info并查找以下Storage Driver行:

$ docker info

Containers: 0
Images: 0
Storage Driver: overlay2
 Backing Filesystem: xfs
<...>

要更改存储驱动程序,请参阅新存储驱动程序的特定说明。一些驱动程序需要其他配置,包括对Docker主机上的物理或逻辑磁盘的配置。

重要提示:更改存储驱动程序时,所有现有的图像和容器都将无法访问。这是因为新存储驱动程序无法使用其图层。如果还原更改,则可以再次访问旧的图像和容器,但是使用新驱动程序提取或创建的任何图像和容器将无法访问。

容器存储驱动程序aufsbtrfsdevicemapperzfsoverlayoverlay2