选择存储驱动
理想情况下,很少数据写入容器的可写层,而是使用 Docker 卷来写入数据。然而,某些工作负载要求您能够写入容器的可写层。这就是存储驱动发挥作用的地方。
Docker 支持多种存储驱动,采用可插拔架构。 存储驱动控制着镜像和容器在 Docker 主机上的存储和管理方式。在阅读了 存储驱动概述之后, 下一步就是为你的工作负载选择最佳的存储驱动。在最常见的场景下,使用具有最佳整体性能和稳定性的存储驱动。
Docker 引擎在 Linux 上提供以下存储驱动程序:
| 驱动程序 | 描述 |
|---|---|
overlay2 | overlay2 是所有当前支持的 Linux 发行版的首选存储驱动程序,无需额外配置。 |
fuse-overlayfs | fuse-overlayfs仅用于在不支持无根overlay2的旧主机上运行无根Docker。自Linux内核5.11以来,无需使用fuse-overlayfs驱动程序,且overlay2即使在无根模式下也能正常工作。详情请参阅
无根模式文档。 |
btrfs 和 zfs | btrfs 和 zfs 存储驱动程序允许高级选项,例如创建“快照”,但需要更多的维护和设置。这些驱动程序中的每一个都依赖于正确配置的后备文件系统。 |
vfs | vfs 存储驱动程序旨在用于测试目的,以及无法使用写时复制文件系统的情况。此存储驱动程序的性能较差,通常不建议在生产环境中使用。 |
Docker Engine 有一个优先级列表,用于在未显式配置存储驱动时选择使用哪个存储驱动,前提是该存储驱动满足先决条件,并自动选择兼容的存储驱动。您可以在 Docker Engine 27.4.0 的源代码 中查看该顺序。
某些存储驱动要求您对后备文件系统使用特定格式。 如果您有外部要求必须使用特定的后备文件系统,这可能会 限制您的选择。请参阅 支持的后备文件系统。
在您缩小了可以选择的存储驱动范围后,您的选择将由您的工作负载特性和所需的稳定性水平决定。请参阅 其他注意事项 以帮助您做出最终决定。
各 Linux 发行版支持的存储驱动
注意
通过编辑守护进程配置文件来修改存储驱动在 Docker Desktop 上不受支持。仅支持默认的
overlay2驱动或 containerd 存储。 下表也不适用于无根模式下的 Docker 引擎。有关无根模式下可用的驱动程序,请参阅 无根模式文档。
您的操作系统和内核可能不支持所有存储驱动程序。例如,只有当您的系统使用 btrfs 作为存储时,才支持 btrfs。通常,以下配置适用于最新版本的 Linux 发行版:
| Linux 发行版 | 推荐的存储驱动 | 备用驱动程序 |
|---|---|---|
| Ubuntu | overlay2 | zfs, vfs |
| Debian | overlay2 | vfs |
| CentOS | overlay2 | zfs, vfs |
| Fedora | overlay2 | zfs, vfs |
| SLES 15 | overlay2 | vfs |
| RHEL | overlay2 | vfs |
当不确定时,最佳的综合配置是使用支持 overlay2 存储驱动器的现代 Linux 发行版,并且对于写入密集型工作负载,使用 Docker 卷而不是依赖将数据写入容器的可写层。
vfs 存储驱动通常不是最佳选择,主要用于在没有其他存储驱动支持的情况下的调试目的。
在使用 vfs 存储驱动之前,请务必阅读
其性能和存储特性及限制。
上表中的建议配置已被大量用户验证有效。如果您使用推荐的配置并发现可重现的问题,很可能会很快得到修复。如果您想使用的驱动程序未在上表中推荐,您可以自行承担风险使用。您仍然可以并且应该报告遇到的任何问题。然而,这些问题相比于使用推荐配置时遇到的问题,优先级较低。
根据您的 Linux 发行版,其他存储驱动(如 btrfs)可能可用。这些存储驱动在特定用例中可能有优势,但可能需要额外的设置或维护,因此在常见场景中不推荐使用。有关详细信息,请参阅这些存储驱动的文档。
支持的备份文件系统
关于 Docker,后备文件系统是 /var/lib/docker/ 所在的文件系统。某些存储驱动程序仅适用于特定的后备文件系统。
| 存储驱动程序 | 支持的备份文件系统 |
|---|---|
overlay2 | xfs with ftype=1, ext4 |
fuse-overlayfs | 任何文件系统 |
btrfs | btrfs |
zfs | zfs |
vfs | 任何文件系统 |
其他注意事项
适合您的工作负载
除其他事项外,每个存储驱动都有其自身的性能特征,使其或多或少适合不同的工作负载。请考虑以下一般性结论:
overlay2在文件级别而不是块级别上运行。这可以更有效地利用内存,但在写密集型工作负载中,容器的可写层可能会变得相当大。- 块级存储驱动(如
btrfs和zfs)在写入密集型工作负载中表现更好(尽管不如 Docker 卷)。 btrfs和zfs需要大量内存。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 主机上的物理或逻辑磁盘的配置。
重要
当您更改存储驱动时,任何现有的镜像和容器将变得无法访问。这是因为它们的层无法被新的存储驱动使用。如果您撤销更改,您可以再次访问旧的镜像和容器,但使用新驱动拉取或创建的任何镜像和容器将无法访问。