Docker存储驱动之Device Mapper简介(2)

  第一次修改已有的数据:
    ▶应用向容器发起修改数据的请求;
    ▶copy-on-write操作定位到需要更新的块;
    ▶分配新的块给容器快照,并拷贝数据到这些块中;
    ▶修改的数据写向新分配的这些块。
  容器中的应用并不会感知到这些按需分配和copy-on-write操作。然而,这些操作还是可能会对应用的读写带来一些延迟。

Docker中配置devicemapper

  devicemapper是部分Linux发行版的默认Docker存储驱动,这其中就包括RHEL和它的分支。当前,以前发行版支持该驱动:
   ●RHEL/CentOS/Fedora
   ●Ubuntu
   ●Debian
   ●Arch Linux
  Docker host使用loop-lvm的配置模式来运行devicemapper。该模式使用系数文件来创建thin池,这些池用于镜像和容器快照。并且这些模式是开箱即用的,无需额外配置。不过,不建议在产品部署中使用loop-lvm模式。
  可以通过docker info命令来查看是否使用了该模式。

$ sudo docker info Containers: 0 Images: 0 Storage Driver: devicemapper Pool Name: docker-202:2-25220302-pool Pool Blocksize: 65.54 kB Backing Filesystem: xfs [...] Data loop file: /var/lib/docker/devicemapper/devicemapper/data Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata Library Version: 1.02.93-RHEL7 (2015-01-28) [...]

  通过上面输出可得出,Docker host使用devicemapper存储驱动。并且,还使用了loop-lvm模式,因为/var/lib/docker/devicemapper/devicemapper下有Data loop file和Metadata loop file这两个文件。这些都是loopback映射的稀疏文件。

在产品中配置direct-lvm模式

  产品部署中应该使用direct-lvm模式,该模式使用块设备来创建thin池。下面的步骤描述了如何在Docker host使用direct-lvm模式得devicemapper存储驱动。
  注意:如果你已经在Docker host上运行了Docker daemon,并且有一些想保存的镜像,那么在执行以下步骤之前,把它们push到Docker Hub,或者你的私有Docker Registry。
  以下步骤会创建一个逻辑卷,配置为thin池,用作后端的存储池。假设你有一个稀疏块设备/dev/xvdf,并且该设备有足够的空间来完成这个任务。在你的环境中,设备标识符和卷的大小可能不同,在你执行下面过程时,你应该替换为适合你环境的值。另外,以下的步骤应该在Docker Daemon停止的时候来执行。
   1) 进入Docker host,并停止Docker daemon;
   2) 安装LVM2和thin-provisioning-tools安装包;
   LVM2安装包提供了用户空间的工具,用于管理逻辑卷。
   thin-provisioning-tools用于激活和管理池。

# on Ubuntu $ sudo apt -y install lvm2 # On CentOS $ sudo yum install -y lvm2

   3) 创建一个物理卷/dev/xvdf来替换块设备;

$ pvcreate /dev/xvdf

   4) 创建卷组docker;

$ vgcreate docker /dev/xvdf

   5) 创建名为thinpool和thinpoolmeta的虚拟卷;
   在该示例中,数据大小是docker卷组大小的95%,留下这些空闲空间,是用于数据或元数据的自动扩容。

$ lvcreate --wipesignatures y -n thinpool docker -l 95%VG $ lvcreate --wipesignatures y -n thinpoolmeta docker -l 1%VG

   6) 把池转换为thin池;

$ lvconvert -y --zero n -c 512K --thinpool docker/thinpool --poolmetadata docker/thinpoolmeta

   7) 通过lvm文件来配置thin池的自动扩容;

$ vi /etc/lvm/profile/docker-thinpool.profile

   8) 指定thin_pool_autoextend_threshold值;
   该值是lvm尝试扩容到可用空间时,当前已空间使用量的百分比(100=禁止)。

thin_pool_autoextend_threshold = 80

   9) 修改thin_pool_autoextend_percent;
   该值是thin池要扩容的百分比(100=禁止)。

thin_pool_autoextend_percent = 20

   10) 检查上面的步骤,你的docker-thinpool.profile文件应该是类似下面的内容:
   一个/etc/lvm/profile/docker-thinpool.profile示例文件:

activation { thin_pool_autoextend_threshold=80 thin_pool_autoextend_percent=20 }

   11) 应用新的lvm profile文件;

$ lvchange --metadataprofile docker-thinpool docker/thinpool

   12) 确认lv是否被修改;

$ lvs -o+seg_monitor

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/5dcf65c3be6b8a0f236003372937140e.html