设为首页 收藏本站
查看: 685|回复: 0

[经验分享] docker 配置Btrfs和Device mapper存储驱动设置

[复制链接]

尚未签到

发表于 2018-5-29 07:40:28 | 显示全部楼层 |阅读模式
  docker 配置Btrfs和Device mapper存储驱动设置
  

  运行环境:
  

  docker -v
  Docker version 1.12.1, build 23cf638
  

  uname -a
  Linux ceph-6-29 3.10.0-327.28.3.el7.x86_64 #1 SMP Thu Aug 18 19:05:49 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux\
  

  一:docker 首次安装完成,默认存储设备为loop 回环设备,会创建一个100G的用于存储数据,和一个2G的用于存储元数据的稀疏文件,然后分别附加到回环块设备/dev/loop0和/dev/loop1。然后基于回环块设备创建thin pool。
  

  1.1:查看回环块设备信息
  [root@ceph-6-29 ~]# losetup -a
  /dev/loop0: [2245]:1937889 (/var/lib/docker/devicemapper/devicemapper/data)
  /dev/loop1: [2245]:1937890 (/var/lib/docker/devicemapper/devicemapper/metadata)
  

  1.2:查看回环设备大小
  

  [root@ceph-6-29 ~]# docker info
  .。。。。。。。。。。。。。。。
  Server Version: 1.12.1
  Storage Driver: devicemapper
  Pool Name: docker-8:197-537316283-pool
  Pool Blocksize: 65.54 kB
  Base Device Size: 10.74 GB《《=============data 默认块大小
  Backing Filesystem: xfs
  Data file: /dev/loop0
  Metadata file: /dev/loop1
  Data Space Used: 11.8 MB
  Data Space Total: 107.4 GB
  Data Space Available: 107.4 GB
  Metadata Space Used: 581.6 kB
  Metadata Space Total: 2.147 GB《《=============metadata 默认块大小
  Metadata Space Available: 2.147 GB
  Thin Pool Minimum Free Space: 10.74 GB
  Udev Sync Supported: true
  

  从上的信息可以看出,Base Device 只有10G 空间,我们测试期间发现,反复发布镜像,很容易把空间沾满,如果你想增大空间执行操作如下:
  

  1.3:关闭docker
  systemctl stop docker
  

  

  1.4:删除docker目录文件,不删除也可以,不过有时候可能会导致docker 服务服务启动。
  rm -rf /var/lib/docker/*
  

  1.5:调整回环设备文件和镜像的大小,例如,我们将回环境设备文件大小设置为100G,元数据文件大小为4G,基础镜像大小为20G:
  另外,–storage-opt还有其它一些参数,比较dm.fs指定文件系统(默认为ext4)等。
  

  

  vim /usr/lib/systemd/system/docker.service
  

  添加启动项内容如下:
ExecStart=/usr/bin/dockerd --storage-opt dm.basesize=100G  --storage-opt dm.loopdatasize=50G --storage-opt dm.loopmetadatasize=4G
  1.6:启动docker服务
  systemctl daemon-reload
  systemctl start docker
  

  

  1.7:验证docker配置信息:
  

  docker info
  .。。。。。。。。。。。。。。
  Server Version: 1.12.1
  Storage Driver: devicemapper
  Pool Name: docker-8:197-537315670-pool
  Pool Blocksize: 65.54 kB
  Base Device Size: 107.4    《《=============Base Device 默认块大小
  Backing Filesystem: xfs
  Data file: /dev/loop0
  Metadata file: /dev/loop1
  Data Space Used: 53.74 MB《《=============data 默认块大小
  Data Space Total: 53.69 GB
  Data Space Available: 53.63 GB
  Metadata Space Used: 532.5 kB
  Metadata Space Total: 4.295     《《=============Metadata 默认块大小
  Metadata Space Available: 4.294 GB
  Thin Pool Minimum Free Space: 5.369 GB
  

  1.8: 以上是直接修改配置调整存储空间大小,验证配置修改生效;
  

  二:通过dd 创建存储空间文件方式调整存储空间;
  

  2.1:在线验证docker配置信息:
  

  docker info
  .。。。。。。。。。。。。。。
  Server Version: 1.12.1
  Storage Driver: devicemapper
  Pool Name: docker-8:197-537315670-pool
  Pool Blocksize: 65.54 kB
  Base Device Size: 107.4    《《=============Base Device 默认块大小
  Backing Filesystem: xfs
  Data file: /dev/loop0
  Metadata file: /dev/loop1
  Data Space Used: 53.74 MB《《=============data 默认块大小
  Data Space Total: 53.69 GB
  Data Space Available: 53.63 GB
  Metadata Space Used: 532.5 kB
  Metadata Space Total: 4.295     《《=============Metadata 默认块大小
  Metadata Space Available: 4.294 GB
  Thin Pool Minimum Free Space: 5.369 GB
  

  

  1.3:关闭docker
  systemctl stop docker
  

  1.4:删除docker目录文件,不删除也可以,不过有时候可能会导致docker 服务服务启动。
  rm -rf /var/lib/docker/*
  

  1.5: 创建存储空间文件
  

  创建目录
  mkdir -p /var/lib/docker/devicemapper/devicemapper
  cd /var/lib/docker/devicemapper/devicemapper
  

  Create your pool:
  dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/data bs=1G count=0 seek=80
  dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/metadata bs=4k count=0 seek=1024000
  

  1.6:验证存储空间大小
  [root@ceph-6-26 devicemapper]# ls -lsh
  total 0
  0 -rw-r--r-- 1 root root  80G Sep 12 21:35 data
  0 -rw-r--r-- 1 root root 4.0G Sep 12 21:36 metadata
  

  1.7: 查看启动服务配置文件:
  vim /usr/lib/systemd/system/docker.service
  

  启动项内容爆出默认即可:
  ExecStart=/usr/bin/dockerd
  1.8:启动docker服务
  systemctl daemon-reload
  systemctl start docker
  

  1.9:验证配置:
  

  [root@ceph-6-26 devicemapper]# docker info
  Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
  Images: 0
  Server Version: 1.12.1
  Storage Driver: devicemapper
  Pool Name: docker-8:197-537315670-pool
  Pool Blocksize: 65.54 kB
  Base Device Size: 10.74   《《=============Base Device 默认块大小
  Backing Filesystem: xfs
  Data file: /dev/loop0
  Metadata file: /dev/loop1
  Data Space Used: 11.8 MB《《=============data 默认块大小
  Data Space Total: 107.4 GB
  Data Space Available: 107.4 GB
  Metadata Space Used: 704.5 kB
  Metadata Space Total: 4.194   《《============= Metadata 默认块大小
  Metadata Space Available: 4.194 GB
  Thin Pool Minimum Free Space: 10.74 GB
  Udev Sync Supported: true
  

  2.0: 验证查看info信息,空间信息没有发生变化,这种配置方式,这种貌似不太靠谱,上面是在国外查询资料时看到有人这么做,仅供参考:
  

  以上两种方式的演示,基本对docker的存储有所了解,但是以上方式都不推荐在生产环境使用,使用回环设备,性能差不说,也不太稳定,总是出一些奇葩的问题,我们深受其害,所有查找资料总计梳理下面两种配置docker 使用存储空间的方式,现已经在生产系统测试验证可靠性。
  
  以下内容可能牵扯很多存储相关的知识,请查询相关资料,本文不做阐述,目前,Docker支持AUFS、Btrfs、Device mapper、OverlayFS、ZFS五种存储驱动。就如Docker官网上说的,没有单一的驱动适合所有的应用场景,要根据不同的场景选择合适的存储驱动,才能有效的提高Docker的性能。
  

  AUFS :最早的docker虽支持的存储启动,以补丁方式加入内核,问题比较多!AUFS能透明覆盖一或多个现有文件系统的层状文件系统,把多层合并成文件系统的单层表示。
  

  devicemapper:写时复制(CoW)。CoW就是copy-on-write,表示只在需要写时才去复制,这个是针对已有文件的修改场景。
  

  Btrfs:btrfs驱动程序,docker build 非常快,-但是devicemapper 设备之间不共享可执行内存。
  

  OverlayFS:是一个非常快的工会的文件系统。它现在合并在主Linux内核作为3.18.0。
  

  具体参考信息如下:
  https://docs.docker.com/engine/reference/commandline/dockerd/
  http://dockone.io/article/1513
  

  下面主要介绍如何快速简单的配置使用btrfs 和  devicemapper  驱动;
  

  三:使用裸设备直接存储docker 数据,即将真实磁盘链接到 docker data 存储数据。
  

  3.1:配置要求,
  

  a:系统需要有一块未使用的磁盘或分区;
  b:掌握分区常用命令
  

  3.2:查看系统分区信息:
  # lsblk
  NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
  sda      8:0    0 558.4G  0 disk
  。。。。。。。。。。。。。。。。。。
  ├─sda4   8:4    0     1K  0 part
  ├─sda5   8:5    0 355.9G  0 part /dbdata
  ├─sda6   8:6    0    80G  0 part 《=======本次演示使用分区
  。。。。。。。。。。。。
  

  3.3:修改前查看info信息:
  [root@dn-5-67 ~]# docker info
  。。。。。。。。。。。。。。。。。。。。。
  Images: 5
  Server Version: 1.12.1
  Storage Driver: devicemapper
  Pool Name: docker-8:2-269225707-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.944 GB
  Data Space Total: 107.4 GB
  Data Space Available: 98.49 GB
  Metadata Space Used: 2.834 MB
  Metadata Space Total: 2.147 GB
  Metadata Space Available: 2.145 GB
  Thin Pool Minimum Free Space: 10.74 GB
  

  3.4:关闭docker
  systemctl stop docker
  

  3.5:删除docker目录文件,不删除也可以,不过有时候可能会导致docker 服务服务启动。
  rm -rf /var/lib/docker/*
  

  3.6:系统分区;
  我这边要做的操作是使用 fdisk 删除 /dev/sda6 分区,将剩余空间重现划分为两个分区,信息如下:
  

  dm.datadev=/dev/sda6  ==>70G
  dm.metadatadev=/dev/sda7  ==>10G
  

  3.7:添加启动项内容如下:
  

  vim /usr/lib/systemd/system/docker.service
  修改启动项如下:
  

  ExecStart=/usr/bin/dockerd --storage-opt dm.datadev=/dev/sda6  --storage-opt dm.metadatadev=/dev/sda7 --storage-opt dm.blocksize=512K --storage-opt dm.basesize=80G
  

  3.8:启动docker服务
  systemctl daemon-reload
  systemctl start docker
  

  3.9:验证修改效果:
  

  [root@dn-5-67 docker]# docker info
  。。。。。。。。。。。。。。。。
  Images: 0
  Server Version: 1.12.1
  Storage Driver: devicemapper
  Pool Name: docker-8:2-403544979-pool
  Pool Blocksize: 524.3 kB
  Base Device Size: 85.9 GB《《=============存储位置已变更
  Backing Filesystem: xfs
  Data file: /dev/sda6《《=============存储位置已变更
  Metadata file: /dev/sda7《《=============存储位置已变更
  Data Space Used: 79.17 MB
  Data Space Total: 85.9 GB
  Data Space Available: 85.82 GB
  Metadata Space Used: 737.3 kB
  Metadata Space Total: 10.74 GB
  Metadata Space Available: 10.74 GB
  Thin Pool Minimum Free Space: 8.59 GB
  

  通过以上配置,可以实现docker将数据存储到裸设备,原理上速度应该不错,这种方式的缺点是,磁盘空间的使用量不好监控。有些人使用lvm 处理之后再这么配置,然后添加配置
  dockerd --storage-opt dm.min_free_space=10%  来保障空间使用情况,我测试了一下直接使用裸设备,这个参数添加后docker 无法启动。我觉得中间加一层lvm 的配置变得有些麻烦,就没这么做。
  

  四:配置使用btrfs 文件系统;
  这种方式配置比较简单,文件系统挂载系统后再将docker 的数据写入,系统后挂载点,系统监控可以监控磁盘空间,可以实现告警。
  

  4.1:配置要求,
  

  a:系统需要有一块未使用的磁盘或分区;
  b:掌握分区常用命令
  

  4.2:修改前docker info 信息如下:
  

  Pool Name: docker-8:197-270105280-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: 768.3 MB
  Data Space Total: 107.4 GB
  Data Space Available: 106.6 GB
  Metadata Space Used: 1.79 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
  

  4.3:查看系统分区信息:
  

  sdm      8:192  0 278.9G  0 disk
  ├.......................
  ├─sdm2   8:194  0    80G  0 part 《=======本次演示使用分区
  ......................
  [root@ceph-6-27 ~]#
  

  4.4:格式化文件系统
  安装基础包
  yum  install btrfs-*
  

  将 /dev/sdm2 格式化为btrfs 文件系统:
  mkfs.btrfs -f /dev/sdm2
  

  

  4.5:查看分区UUID ,为挂载做准备:
  blkid
  

  /dev/sdm1: UUID="4f00e697-43a9-4088-9f47-363238ddd36c" TYPE="xfs"
  /dev/sdm2: UUID="15b78ce6-5ddd-42e3-a3e0-fd226e3dbd4a" UUID_SUB="66494e3f-4708-4376-a416-c769bfa96651" TYPE="btrfs"
  

  4.5:关闭docker
  systemctl stop docker
  

  4.6:删除docker目录文件,不删除也可以,不过有时候可能会导致docker 服务服务启动。
  rm -rf /var/lib/docker/*
  

  4.7:添加系统开机自动挂载:
  vim /etc/fstab
  

  UUID=15b78ce6-5ddd-42e3-a3e0-fd226e3dbd4a /var/lib/docker         btrfs   defaults        0 0
  保存退出后:
  执行 mount -a
  

  查看系统分区挂载情况:
  

  [root@ceph-6-27 ~]# df -h
  Filesystem      Size  Used Avail Use% Mounted on
  ..............................
  /dev/sdm2        80G  2.4G   77G   3% /var/lib/docker
  

  

  4.8:添加启动项内容如下:
  

  Btrfs 配置选项 :btrfs.min_space  ,剩余空间小于这个值,系统会给出告警信息;
  

  vim /usr/lib/systemd/system/docker.service
  

  ExecStart=/usr/bin/dockerd -s btrfs -g /var/lib/docker --storage-opt btrfs.min_space=10G
  

  4.9:启动docker服务
  systemctl daemon-reload
  systemctl start docker
  

  4.10: 配置信息验证:
  

  [root@ceph-6-27 ~]# docker info
  ................
  Server Version: 1.12.1
  Storage Driver: Btrfs          <================存储信息
  Build Version: Btrfs v3.19.1
  Library Version: 101
  Logging Driver: json-file
  Cgroup Driver: cgroupfs
  Plugins:
  Volume: local
  Network: host bridge null overlay
  Swarm: inactive
  Runtimes: runc
  Default Runtime: runc
  

  以上3-4 步骤介绍了配置Btrfs和Device mapper存储驱动设置,不足之处各位看官指正。
  

  

  参考文档:
  

  Docker五种存储驱动原理及应用场景和性能测试对比:http://dockone.io/article/1513
  

  Docker容器的持久存储模式:http://dockone.io/article/1283
  http://vitan.github.io/docker/2016/01/22/aufs-vs-devicemapper.html
  http://www.cnblogs.com/itcomputer/p/5667917.html
  https://github.com/snitm/docker/tree/master/daemon/graphdriver/devmapper
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-482339-1-1.html 上篇帖子: docker命令?? 下篇帖子: Docker与OpenStack集成实战
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表