选择一个存储驱动
理想情况下,很少的数据会被写入容器的可写层,你应该使用Docker卷来写入数据。然而,某些工作负载要求你能够写入容器的可写层。这就是存储驱动发挥作用的地方。
Docker 支持多种存储驱动,采用可插拔架构。存储驱动控制着镜像和容器在 Docker 主机上的存储和管理方式。在阅读了存储驱动概述之后,下一步是为您的工作负载选择最佳的存储驱动。在最常见的场景中使用具有最佳整体性能和稳定性的存储驱动。
注意
本页讨论在Linux上运行的Docker Engine的存储驱动程序。如果您在Windows作为主机操作系统的情况下运行Docker守护进程,唯一支持的存储驱动程序是windowsfilter。有关更多信息,请参阅windowsfilter。
Docker 引擎在 Linux 上提供以下存储驱动程序:
| Driver | Description |
|---|---|
overlay2 | overlay2 is the preferred storage driver for all currently supported Linux distributions, and requires no extra configuration. |
fuse-overlayfs | fuse-overlayfsis preferred only for running Rootless Docker on an old host that does not provide support for rootless overlay2. The fuse-overlayfs driver does not need to be used since Linux kernel 5.11, and overlay2 works even in rootless mode. Refer to the
rootless模式文档 for details. |
btrfs and zfs | The btrfs and zfs storage drivers allow for advanced options, such as creating "snapshots", but require more maintenance and setup. Each of these relies on the backing filesystem being configured correctly. |
vfs | The vfs storage driver is intended for testing purposes, and for situations where no copy-on-write filesystem can be used. Performance of this storage driver is poor, and is not generally recommended for production use. |
如果未明确配置存储驱动程序,Docker Engine 会有一个优先列表来选择使用哪个存储驱动程序,前提是该存储驱动程序满足先决条件,并自动选择一个兼容的存储驱动程序。您可以在Docker Engine 27.4.0 的源代码中查看顺序。
某些存储驱动程序要求您使用特定的格式作为后备文件系统。 如果您有外部要求需要使用特定的后备文件系统,这可能会限制您的选择。请参阅 支持的后备文件系统。
在您缩小了可以选择的存储驱动范围后,您的选择取决于您工作负载的特性以及您所需的稳定性水平。请参阅其他考虑因素以帮助做出最终决定。
每个Linux发行版支持的存储驱动程序
注意
在Docker Desktop上不支持通过编辑守护进程配置文件来修改存储驱动。仅支持默认的
overlay2驱动或containerd存储。以下表格也不适用于无根模式下的Docker引擎。有关无根模式下可用的驱动,请参阅无根模式文档。
您的操作系统和内核可能不支持所有的存储驱动。例如,btrfs 只有在您的系统使用 btrfs 作为存储时才被支持。一般来说,以下配置在最新版本的 Linux 发行版上可以工作:
| Linux distribution | Recommended storage drivers | Alternative drivers |
|---|---|---|
| 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/所在的位置。一些存储驱动程序仅适用于特定的支持文件系统。
| Storage driver | Supported backing filesystems |
|---|---|
overlay2 | xfs with ftype=1, ext4 |
fuse-overlayfs | any filesystem |
btrfs | btrfs |
zfs | zfs |
vfs | any filesystem |
其他考虑
适合您的工作负载
除此之外,每个存储驱动程序都有其自己的性能特征,使其或多或少适合不同的工作负载。考虑以下概括:
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主机上的物理或逻辑磁盘的配置。
重要
当你更改存储驱动时,任何现有的镜像和容器将变得不可访问。这是因为它们的层不能被新的存储驱动使用。如果你回滚更改,你可以再次访问旧的镜像和容器,但任何使用新驱动拉取或创建的镜像和容器将变得不可访问。