本文介绍Docker存储驱动的特性。列出Docker支持的存储驱动以及管理它们相关的命令。最后,为你在选择存储驱动时提供数据参考。
可插拔的存储驱动架构
Docker的存储驱动架构设计成可插拔的,这可以让你能根据你的环境和使用场景灵活地选择使用一个存储驱动。每个Docker存储驱动基于Linux文件系统或卷管理器。此外,每个存储驱动器以其自己独特的方式自由地实现镜像数据层和容器数据层的管理。这意味着一些存储驱动在不同的情况下会比其它的驱动会有更好的表现。
一旦你决定了哪个驱动对于你是最好的,你可以在Docker启动时设置为这个驱动。Docker daemon只能运行一个存储驱动,之后所有由docker daemon创建的容器都使用同样的存储驱动。下面的表格显示docker支持的存储驱动技术及它们驱动的名称:
技术 | 存储驱动名称 |
---|---|
OverlayFS | overlay或overlay2 |
AUFS | aufs |
Btrfs | btrfs |
Device Mapper | devicemapper |
VFS | vfs |
ZFS | zfs |
要找出目前docker daemon使用的是哪个存储驱动,可以使用docker info命令:
- $ docker info
- Containers: 0
- Images: 0
- Storage Driver: overlay
- Backing Filesystem: extfs
- Execution Driver: native-0.2
- Logging Driver: json-file
- Kernel Version: 3.19.0-15-generic
- Operating System: Ubuntu 15.04
- … output truncated …
info子命令显示出Docker使用的存储驱动是overlay,Backing Filesystem为extfs。extfs值意思是overlay存储驱动在现有的ext文件系统之上操作。Backing Filesystem指的是在/var/lib/docker创建docker主机本地存储区域的文件系统。你能选择使用哪些存储驱动部分取决于你计划在哪个backing filesystem创建docker主机本地存储区域。一些存储驱动能在不同的backing filesystems上操作。不过有些存储驱动需要与存储驱动相同的backing filesystem。例如btrfs存储驱动需要Btrfs backing filesystem。下面的表格列出每个存储驱动以及是否必须匹配主机backing filesystem:
存储驱动 | 可用的文件系统 | 禁用的文件系统 |
---|---|---|
overlay | ext4 xfs | btrfs aufs overlay overlay2 zfs eCryptfs |
overlay2 | ext4 xfs | btrfs aufs overlay overlay2 zfs eCryptfs |
aufs | ext4 xfs | btrfs aufs eCryptfs |
btrfs | btrfs only | N/A |
devicemapper | direct-lvm | N/A |
vfs | debugging only | N/A |
zfs | zfs only | N/A |
你可以在dockerd命令传递–storage-driver=参数来设置存储驱动,或者在/etc/default/docker文件中设置DOCKER_OPTS选项。
下面的命令显示如何使用dockerd命令以及–storage-driver参数来设置存储驱动为devicemapper:
- $ dockerd –storage-driver=devicemapper &
- $ docker info
- Containers: 0
- Images: 0
- Storage Driver: devicemapper
- Pool Name: docker-252:0-147544-pool
- Pool Blocksize: 65.54 kB
- Backing Filesystem: extfs
- Data file: /dev/loop0
- Metadata file: /dev/loop1
- Data Space Used: 1.821 GB
- Data Space Total: 107.4 GB
- Data Space Available: 3.174 GB
- Metadata Space Used: 1.479 MB
- Metadata Space Total: 2.147 GB
- Metadata Space Available: 2.146 GB
- Thin Pool Minimum Free Space: 10.74 GB
- Udev Sync Supported: true
- Deferred Removal Enabled: false
- Data loop file: /var/lib/docker/devicemapper/devicemapper/data
- Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata
- Library Version: 1.02.90 (2014-09-01)
- Execution Driver: native-0.2
- Logging Driver: json-file
- Kernel Version: 3.19.0-15-generic
- Operating System: Ubuntu 15.04
- <output truncated>
你选择的存储驱动会影响你容器化应用的性能。所以理解不同的存储驱动可用选项并为你的应用选择一个合适的驱动很重要。最后,在本文你会找到帮助你选择一个适合的驱动的建议。
你应该选择哪个存储驱动
有几个因素会影响存储驱动的选择。不过这两个因素要特别注意:
考虑到这些因素,以下应该能为你提供一些指导。
稳定性
为了最稳定和良好的docker体验,你应该考虑以下:
经验和专长
选择一个你和你团队/组织有使用经验的存储驱动。例如,如果你使用的是RHEL或其下游分支之一,你可能已经具有LVM和Device Mapper的使用经验。如果是这样,你可能希望使用devicemapper驱动。
如果你对任何的存储驱动都没有使用经验,并且你想要一个易于使用的稳定的Docker体验,你应该考虑使用docker安装时设置的默认驱动。
面向未来
许多用户认为docker未来存储驱动是OverlayFS。不过,它还不太成熟,对于已经成熟的驱动如aufs和devicemapper不够稳定。由于这个原因,你应该慎重使用OverlayFS驱动,并且作好相对于使用一个更成熟驱动遇到更多bug的准备。
下面的图表列出的每一个存储驱动的优势和劣势。在选择要使用的存储驱动程序时,请考虑下表提供的指导以及上述要点。
Overlay vs Overlay2
OverlayFS有两个使用相同的OverlayFS技术但是不同的实现及硬盘存储的不兼容的存储驱动。由于存储上不兼容,在两者之间切换需要重建所有的镜像。overlay驱动是原始的实现,是Docker 1.11和之前版本的唯一选项。overlay驱动具有已知的inode耗尽问题以及提交性能的限制。overlay2驱动解决了这些问题,不过仅与Linux内核4.0及更高的版本兼容。对于使用4.0之间的内核或已存在overlay graph的用户,推荐继续使用overlay。对于使用至少4.0内核版本的,或所需overlay graph数据的用户,那么可以使用overlay2。