先说一下我的系统环境,系统 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]#
三、生产正式环境的选择
- 如果你的系统内核是在3.18以下,又不便升级内核时,那就老老实实的使用device-mapper driver方式即可。
- 如果你的系统内核版本大于等于 3.18,那么是支持overlayfs driver方式,强烈建议进行修改。在启动参数里添加,我这边是在/etc/systemd/system/docker.service 里, docker daemon -s overlay
参考文章:
- Docker Storage Driver: Don’t Use Device mapper driver
- Docker storage driver history and overlayfs
- 详解docker存储驱动
版权声明:除特殊说明,文章均为博主 久酷 原创文章,转载请注明来源