第一次修改已有的数据:
▶应用向容器发起修改数据的请求;
▶copy-on-write操作定位到需要更新的块;
▶分配新的块给容器快照,并拷贝数据到这些块中;
▶修改的数据写向新分配的这些块。
容器中的应用并不会感知到这些按需分配和copy-on-write操作。然而,这些操作还是可能会对应用的读写带来一些延迟。
devicemapper是部分Linux发行版的默认Docker存储驱动,这其中就包括RHEL和它的分支。当前,以前发行版支持该驱动:
●RHEL/CentOS/Fedora
●Ubuntu
●Debian
●Arch Linux
Docker host使用loop-lvm的配置模式来运行devicemapper。该模式使用系数文件来创建thin池,这些池用于镜像和容器快照。并且这些模式是开箱即用的,无需额外配置。不过,不建议在产品部署中使用loop-lvm模式。
可以通过docker info命令来查看是否使用了该模式。
通过上面输出可得出,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用于激活和管理池。
3) 创建一个物理卷/dev/xvdf来替换块设备;
$ pvcreate /dev/xvdf4) 创建卷组docker;
$ vgcreate docker /dev/xvdf 5) 创建名为thinpool和thinpoolmeta的虚拟卷;
在该示例中,数据大小是docker卷组大小的95%,留下这些空闲空间,是用于数据或元数据的自动扩容。
6) 把池转换为thin池;
$ lvconvert -y --zero n -c 512K --thinpool docker/thinpool --poolmetadata docker/thinpoolmeta7) 通过lvm文件来配置thin池的自动扩容;
$ vi /etc/lvm/profile/docker-thinpool.profile 8) 指定thin_pool_autoextend_threshold值;
该值是lvm尝试扩容到可用空间时,当前已空间使用量的百分比(100=禁止)。
9) 修改thin_pool_autoextend_percent;
该值是thin池要扩容的百分比(100=禁止)。
10) 检查上面的步骤,你的docker-thinpool.profile文件应该是类似下面的内容:
一个/etc/lvm/profile/docker-thinpool.profile示例文件:
11) 应用新的lvm profile文件;
$ lvchange --metadataprofile docker-thinpool docker/thinpool12) 确认lv是否被修改;
$ lvs -o+seg_monitor