选择存储驱动程序

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

Docker 使用可插拔架构支持多个存储驱动程序。存储驱动程序控制如何在 Docker 主机上存储和管理镜像和容器。阅读存储驱动程序概述后,下一步是为您的工作负载选择最佳存储驱动程序。在最常见的情况下,使用整体性能和稳定性最佳的存储驱动程序。

Docker Engine 在 Linux 上提供以下存储驱动程序

驱动程序描述
overlay2overlay2 是所有当前支持的 Linux 发行版的首选存储驱动程序,无需额外配置。
fuse-overlayfsfuse-overlayfs 仅适用于在不支持无根 overlay2 的旧主机上运行无根 Docker。自 Linux 内核 5.11 以来,无需使用 fuse-overlayfs 驱动程序,即使在无根模式下 overlay2 也能正常工作。有关详细信息,请参阅无根模式文档
btrfszfsbtrfszfs 存储驱动程序允许使用高级选项,例如创建“快照”,但是需要更多维护和设置。这些都依赖于底层文件系统配置正确。
vfsvfs 存储驱动程序旨在用于测试目的,以及无法使用任何写时复制文件系统的情况。此存储驱动程序的性能很差,通常不建议用于生产环境。

如果未显式配置存储驱动程序,则 Docker Engine 具有一个优先级列表,用于在满足前提条件的情况下使用哪个存储驱动程序,并自动选择兼容的存储驱动程序。您可以在Docker Engine 27.3.1 的源代码中查看顺序。

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

缩小您可以选择的存储驱动程序范围后,您的选择将取决于工作负载的特性以及您需要的稳定性级别。请参阅其他注意事项,以获取最终决策的帮助。

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

注意

修改守护进程配置文件来修改存储驱动程序在Docker Desktop上不受支持。只支持默认的overlay2驱动程序或containerd存储。下表也不适用于rootless模式下的Docker Engine。有关rootless模式下可用的驱动程序,请参见Rootless模式文档

您的操作系统和内核可能不支持所有存储驱动程序。例如,只有当您的系统使用btrfs作为存储时,才支持btrfs。一般来说,以下配置适用于最新版本的Linux发行版。

Linux发行版推荐的存储驱动程序备选驱动程序
Ubuntuoverlay2zfs, vfs
Debianoverlay2vfs
CentOSoverlay2zfs, vfs
Fedoraoverlay2zfs, vfs
SLES 15overlay2vfs
RHELoverlay2vfs

如有疑问,最佳的全面配置是使用支持overlay2存储驱动程序的内核的现代Linux发行版,并为写入密集型工作负载使用Docker卷,而不是依赖于写入容器的可写层。

vfs存储驱动程序通常不是最佳选择,主要用于在不支持其他存储驱动程序的情况下进行调试。在使用vfs存储驱动程序之前,请务必阅读有关其性能、存储特性和限制的信息。

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

根据您的Linux发行版,可能还提供其他存储驱动程序,例如btrfs。这些存储驱动程序可能对特定用例具有优势,但可能需要额外的设置或维护,因此不推荐用于常见场景。有关详细信息,请参阅这些存储驱动程序的文档。

支持的底层文件系统

关于Docker,后端文件系统是/var/lib/docker/所在的文件系统。某些存储驱动程序仅适用于特定的后端文件系统。

存储驱动程序支持的底层文件系统
overlay2xfs (ftype=1), ext4
fuse-overlayfs任何文件系统
btrfsbtrfs
zfszfs
vfs任何文件系统

其他注意事项

适合您的工作负载

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

  • overlay2在文件级别而不是块级别运行。这更有效地使用内存,但容器的可写层在写入密集型工作负载中可能会变得相当大。
  • 块级存储驱动程序(如btrfszfs)在写入密集型工作负载中性能更好(尽管不如Docker卷)。
  • btrfszfs需要大量内存。
  • zfs是高密度工作负载(如PaaS)的良好选择。

有关性能、适用性和最佳实践的更多信息,请参阅每个存储驱动程序的文档。

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

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

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

稳定性

对于某些用户而言,稳定性比性能更重要。尽管Docker认为此处提到的所有存储驱动程序都是稳定的,但有些是较新的,并且仍在积极开发中。一般来说,overlay2提供了最高的稳定性。

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

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

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

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

要查看Docker当前正在使用的存储驱动程序,请使用docker info并查找Storage Driver行。

$ docker info

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

要更改存储驱动程序,请参阅新存储驱动程序的具体说明。某些驱动程序需要额外的配置,包括对Docker主机上的物理或逻辑磁盘的配置。

重要

更改存储驱动程序后,任何现有镜像和容器都将无法访问。这是因为新存储驱动程序无法使用它们的层。如果您恢复更改,则可以再次访问旧的镜像和容器,但是使用新驱动程序拉取或创建的任何镜像和容器都将无法访问。