选择存储驱动程序

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

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

注意

本页讨论 Linux 上 Docker Engine 的存储驱动程序。如果您在以 Windows 作为主机操作系统的情况下运行 Docker 守护进程,唯一支持的存储驱动程序是 windowsfilter。有关更多信息,请参阅windowsfilter

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

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

如果未显式配置存储驱动程序,Docker Engine 会有一个优先级列表来确定使用哪个存储驱动程序(假设该存储驱动程序满足先决条件),并自动选择兼容的存储驱动程序。您可以在 Docker Engine 28.1.1 的源代码 中查看顺序。

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

在您缩小可选存储驱动程序范围后,您的选择将取决于您的工作负载特性和所需的稳定性水平。请参阅其他考量,以帮助您做出最终决定。

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

注意

通过编辑守护进程配置文件来修改存储驱动程序在 Docker Desktop 上不受支持。仅支持默认的 overlay2 驱动程序或containerd 存储。以下表格也不适用于无根模式下的 Docker Engine。有关无根模式下可用的驱动程序,请参阅无根模式文档

您的操作系统和内核可能不支持所有存储驱动程序。例如,仅当您的系统使用 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 主机上的物理或逻辑磁盘进行配置。

重要

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

页面选项