Docker 存储驱动storage driver 的选择

先说一下我的系统环境,系统 centos 7.2,docker版本 V1.10.2

一、Docker 存储驱动背景

Docker模型的核心部分是有效利用分层镜像机制,镜像可以通过分层来进行继承,基于基础镜像,可以制作各种具体的应用镜像。不同 Docker 容器就可以共享一些基础的文件系统层,同时再加上自己独有的改动层,大大提高了存储的效率。

在docker0.7中引入了storage driver,更之后针对镜像存储docker采用了几种不同的存储drivers,包括:aufs,devicemapper,btrfs 和overlay。

device-mapper driver

最开始使用AUFS,但AUFS一直没有进入内核主线。但RHEL/Fedora等发行版本并不支持AUFS,所以,Redhat的Alexander Larsson实现了device-mapper的driver,现在dm driver由Vincent Batts在维护。在这篇文章中,Alexander详细介绍了他当时的想法。由于btrfs不成熟、overlayfs也没有进入内核主线,所以,他选择了device-mapper作为RHEL/Fedora下的解决方案。

在相当长一段时间,device-mapper几乎成为生产环境的使用docker的唯一选择,但在实际中,经常会遇到很多问题。

btrfs driver

再后来社区实现了btrfs driver。但btrfs在稳定性、性能上都存在一些问题

overlayfs driver

在内核3.18中,overlayfs终于正式进入主线。相比AUFS,overlayfs设计简单,代码也很少。而且可以实现pagecache共享。似乎是一个非常好的选择。于是,在这之后,docker社区开始转向将overlayfs作为第一选择。

二、开发、测试环境的选择

目前在docker v1.10.2版本中,默认安装完成后系统采用的为 device-mapper driver,该存储方式在官方文档中已强烈不建议使用,如系统中提示:
WARNING: Usage of loopback devices is strongly discouraged for production use. Either use `–storage-opt dm.thinpooldev` or use `–storage-opt dm.no_warn_on_loop_devices=true` to suppress this warning.
Metadata loop file: /home/dockerfile/devicemapper/devicemapper/metadata

看网上很多做法推荐正式环境是采用 `–storage-opt dm.thinpooldev` or use `–storage-opt dm.no_warn_on_loop_devices=true` 的方式隐藏该警告,这种做法不过是掩耳盗铃罢了。

[root@localhost lib]# docker info
Containers: 1
 Running: 1
 Paused: 0
 Stopped: 0
Images: 7
Server Version: 1.10.2
Storage Driver: devicemapper
 Pool Name: docker-253:2-4563448077-pool
 Pool Blocksize: 65.54 kB
 Base Device Size: 10.74 GB
 Backing Filesystem: xfs
 Data file: /dev/loop0
 Metadata file: /dev/loop1
 Data Space Used: 1.265 GB
 Data Space Total: 107.4 GB
 Data Space Available: 106.1 GB
 Metadata Space Used: 2.605 MB
 Metadata Space Total: 2.147 GB
 Metadata Space Available: 2.145 GB
 Udev Sync Supported: true
 Deferred Removal Enabled: false
 Deferred Deletion Enabled: false
 Deferred Deleted Device Count: 0
 Data loop file: /home/dockerfile/devicemapper/devicemapper/data
 WARNING: Usage of loopback devices is strongly discouraged for production use. Either use `--storage-opt dm.thinpooldev` or use `--storage-opt dm.no_warn_on_loop_devices=true` to suppress this warning.
 Metadata loop file: /home/dockerfile/devicemapper/devicemapper/metadata
 Library Version: 1.02.107-RHEL7 (2015-12-01)
Execution Driver: native-0.2
Logging Driver: json-file
Plugins: 
 Volume: local
 Network: null host bridge
Kernel Version: 3.10.0-327.4.4.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 8
Total Memory: 15.35 GiB
Name: localhost.localdomain
ID: UQP2:Z5KF:4DGT:3JRA:QUJU:V554:VUZD:PH2K:AD4C:57X3:TLA4:M6VH
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
[root@localhost lib]#

三、生产正式环境的选择

  1. 如果你的系统内核是在3.18以下,又不便升级内核时,那就老老实实的使用device-mapper driver方式即可。
  2. 如果你的系统内核版本大于等于 3.18,那么是支持overlayfs driver方式,强烈建议进行修改。在启动参数里添加,我这边是在/etc/systemd/system/docker.service 里, docker daemon -s overlay

参考文章:

  1. Docker Storage Driver: Don’t Use Device mapper driver
  2. Docker storage driver history and overlayfs
  3. 详解docker存储驱动

Leave a Reply


正在读取数据……