Docker 存储驱动程序
理想情况下,很少有数据写入容器的可写层,并且您使用 Docker 卷来写入数据。但是,某些工作负载要求您能够写入容器的可写层。这就是存储驱动程序发挥作用的地方。
Docker 使用可插拔架构支持多种存储驱动程序。存储驱动程序控制如何在 Docker 主机上存储和管理映像和容器。阅读存储驱动程序概述后,下一步是为您的工作负载选择最佳的存储驱动程序。在最常见的场景中使用整体性能和稳定性最好的存储驱动程序。
Docker Engine 在 Linux 上提供以下存储驱动程序:
司机 | 描述 |
---|---|
overlay2 | overlay2 是当前所有支持的 Linux 发行版的首选存储驱动程序,并且不需要额外的配置。 |
fuse-overlayfs | fuse-overlayfs 仅当在不支持 rootless 的主机上运行 Rootless Docker 时才首选overlay2 。在Ubuntu和Debian 10上,fuse-overlayfs 不需要使用驱动程序,overlay2 即使在无根模式下也可以工作。有关详细信息,请参阅
无根模式文档。 |
btrfs 和zfs | btrfs 和存储驱动程序zfs 允许高级选项,例如创建“快照”,但需要更多的维护和设置。其中每一个都依赖于正确配置的支持文件系统。 |
vfs | 存储vfs 驱动程序旨在用于测试目的以及无法使用写时复制文件系统的情况。该存储驱动程序的性能较差,通常不建议用于生产使用。 |
如果没有显式配置存储驱动程序,Docker 引擎有一个优先使用哪个存储驱动程序的列表,假设存储驱动程序满足先决条件,并自动选择兼容的存储驱动程序。您可以在Docker Engine 26.1.0 的源代码中看到顺序 。
某些存储驱动程序要求您为支持文件系统使用特定格式。如果您有使用特定支持文件系统的外部要求,这可能会限制您的选择。请参阅 支持的后备文件系统。
在缩小了可供选择的存储驱动程序的范围后,您的选择将取决于您的工作负载特征和所需的稳定性级别。请参阅 其他注意事项以帮助做出最终决定。
每个 Linux 发行版支持的存储驱动程序
笔记
Docker Desktop 不支持通过编辑守护程序配置文件来修改存储驱动程序。仅支持默认
overlay2
驱动程序或 containerd存储。下表也不适用于无根模式下的 Docker Engine。有关无根模式下可用的驱动程序,请参阅 无根模式文档。
您的操作系统和内核可能不支持每个存储驱动程序。例如,仅当您的系统用作存储btrfs
时才支持。btrfs
一般来说,以下配置适用于最新版本的 Linux 发行版:
Linux发行版 | 推荐的存储驱动程序 | 替代驱动程序 |
---|---|---|
乌班图 | overlay2 | zfs ,vfs |
德班 | overlay2 | vfs |
中央操作系统 | overlay2 | zfs ,vfs |
软呢帽 | overlay2 | zfs ,vfs |
斯莱斯15 | overlay2 | vfs |
RHEL | overlay2 | vfs |
如有疑问,最好的全面配置是使用具有支持overlay2
存储驱动程序内核的现代 Linux 发行版,并使用 Docker 卷来处理写入量大的工作负载,而不是依赖将数据写入容器的可写层。
存储驱动程序vfs
通常不是最佳选择,主要用于在不支持其他存储驱动程序的情况下进行调试。在使用vfs
存储驱动程序之前,请务必阅读
其性能和存储特性及限制。
众所周知,上表中的建议适用于大量用户。如果您使用推荐的配置并发现可重现的问题,则可能会很快得到修复。如果您想要使用的驱动程序不是根据此表推荐的,您可以自行承担运行它的风险。您可以而且仍然应该报告您遇到的任何问题。但是,此类问题的优先级低于使用推荐配置时遇到的问题。
根据您的 Linux 发行版,其他存储驱动程序,例如btrfs
可能可用。这些存储驱动程序对于特定用例具有优势,但可能需要额外的设置或维护,因此不建议将它们用于常见场景。有关详细信息,请参阅这些存储驱动程序的文档。
支持的支持文件系统
对于 Docker,后备文件系统是
/var/lib/docker/
所在的文件系统。某些存储驱动程序仅适用于特定的支持文件系统。
存储驱动 | 支持的支持文件系统 |
---|---|
overlay2 | xfs 当 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 主机上的物理或逻辑磁盘的配置。
重要的
当您更改存储驱动程序时,任何现有映像和容器都将无法访问。这是因为新的存储驱动程序无法使用它们的层。如果您恢复更改,您可以再次访问旧的映像和容器,但使用新驱动程序拉取或创建的任何内容都将无法访问。