选择存储驱动程序
本节描述了 Docker 的存储驱动程序特性。它列出了 Docker 支持的存储驱动程序以及与管理它们相关联的基本命令。最后,本页提供了选择存储驱动程序的指南。
本节的内容是为已经了解存储驱动程序技术的读者准备的。
可插拔存储驱动架构
Docker有一个可插拔存储驱动架构。这就可以根据自己实际的环境和用例来选择最适合的存储驱动。每个Docker存储驱动程序都基于一个Linux文件系统或卷管理器。
此外,每个存储驱动程序都可以*地以自己独特的方式实现对镜像层和容器层的管理。这意味着在不同的环境下,某些存储驱动程序的性能要优于其他存储驱动程序。
一旦确定了哪个驱动程序是最好的,就可以在启动时在Docker daemon
上设置这个驱动程序。因此,Docker守护进程只能运行一个存储驱动程序,并且由该守护进程实例创建的所有容器都使用同一个存储驱动程序。
下表显示了所支持的存储驱动程序技术及其驱动程序名称:
Technology | Storage driver name |
---|---|
OverlayFS |
overlay or overlay2
|
AUFS | aufs |
Btrfs | btrfs |
Device Mapper | devicemapper |
VFS | vfs |
ZFS | zfs |
要知道守护进程上设置了哪个存储驱动程序,可以使用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 ...
说明:
(1)Docker daemon使用overlay作为存储驱动,而其Backing Filesystem是extfs。
(2)extfs意味着 overlay 存储驱动是在现有的(ext)文件系统上操作。
(3)后端文件系统指的是创建了Docker host的本地存储区域/var/lib/docker的文件系统。
存储驱动,可以运行在某种后端文件系统上,但也有些不支持的后端文件系统,它们之间的对应关系如下表:
Storage driver | 后端文件系统 | 不支持的后端文件系统 |
---|---|---|
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 |
设置存储驱动方式有两种:
(1)可以在dockerd启动的时候加入--storage-driver=<name>
如:
```python
$ 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>
```
(2)更改配置文件
```python
#添加 daemon.json 文件
echo "{
"storage-driver": "overlay2",
"storage-opts": [ "overlay2.override_kernel_check=true" ],
"registry-mirrors": ["https://xxx.mirror.aliyuncs.com"],
"live-restore" : false
}" >> /etc/docker/daemon.json
```
说明:存储驱动的选择会影响你容器应用的性能,所以很有必要理解存储驱动之间的区别和优缺点,然后才能选择合适的驱动。
共享存储系统和存储驱动
很多企业都从共享文件系统(如SAN和NAS)中获取存储资源。通常情况下,这都能带来更好的性能和更高可用性,还有如超配、副本删除、压缩等高级特性。
Docker存储驱动和数据卷都可以运行在这些共享存储系统提供的存储上,这使得Docker可以利用这些系统提供的优越性能和可用性。然而,Docker并没有与这些底层系统集成。
使用哪种存储驱动呢?
有几个因素会影响存储驱动程序的选择。但是,必须记住这两个事实:
(1)没有哪种驱动适合所有的用户场景;
(2)存储驱动一直都在提升和改进;
此外,下面的内容,也可以提供一些指导意见。
稳定性
要获得最稳定、最轻松的Docker体验,应该考虑以下几点:
(1)使用您的发行版的默认存储驱动程序。当Docker安装时,它会根据系统的配置选择一个默认的存储驱动程序。稳定性是影响默认使用哪种存储驱动程序的重要因素。偏离此默认值可能会增加遇到bug和细微差别的几率。
(2)遵守CS Engine compatibility matrix指定的配置。CS Engine是Docker Engine的商业化版本,它代码基于开源的Engine。不过它有一套限制的支持配置,而这个支持的配置使用最稳定成熟的存储驱动。
经验和专业技能
(1)选择你和你的团队都有经验的一种存储。比如,你使用RHEL系列的OS,你可能对LVM和Device Mapper很有经验,因此,你应该使用devicemapper存储驱动。
(2)如果你对Docker提供的存储驱动都没有经验,并且你希望使用简单可用的稳定的Docker环境,那么你可以考虑使用你发行版默认的Docker存储驱动。
面向未来
很多人认为OverlayFS是Docker存储驱动的未来。然而,它还不够成熟,并且和aufs、devicemapper相比暂时还不够稳定。因此,使用OverlayFS时应该注意。
下图列出了所有驱动,并列出了它们的优缺点。如果要选择存储驱动,那么可以参考下面提到的内容。
Overlay vs Overlay2
OverlayFS有两种存储驱动,它们使用了相同的OverlayFS技术,但却有着不同的实现,在磁盘使用上也并不互相兼容。因为不兼容,两者之间的切换必须重新创建所有的镜像。overlay驱动是最原始的OverlayFS实现,并且,在Docker1.11之前是仅有的OverlayFS驱动选择。overlay驱动在inode消耗方面有着较明显的限制,并且会损耗一定的性能。overlay2驱动解决了这种限制,不过只能在Linux kernel 4.0以上使用它。
所以,对于使用Linux kernel 4.0
之前的建议使用 overlay,之后的建议使用 overlay2。