Docker 存储驱动程序

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

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

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

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

Docker Engine 拥有一个优先级列表,用于在未明确配置存储驱动程序的情况下使用哪个存储驱动程序,假设存储驱动程序满足先决条件,并自动选择一个兼容的存储驱动程序。您可以在 Docker Engine 27.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 主机上的物理或逻辑磁盘进行配置。

重要

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