yabo国际
  咨询电话:18870036599

yobo88体育网页版

docker with devicemapper storage driver

storage driver的选择依据很多的条件,比如发行版版本,团队技术积累,稳定性等。device mapper是redhat/centos中最适合的, 稳定性也可以,内核原生支持,基于块设备,对于高负载情况下可以性能较好,支持quota。缺点是:占用内存较多,启动同一个镜像的多个实例,需要多次加载并在内存中保存多个实例的信息,在高密度的情况下不适用;在小文件的情况下性能不如aufs,overlay。接下里我们就对device mappper做个剖析。

Device Mapper介绍

首先请看:Linux 内核中的 Device Mapper 机制

device mapper中允许有不同的target driver,docker结合使用了thin provisioning与snapshot两种技术,thin provisioning 就是一种对disk超配的机制,snapshot 是COW的机制。

根据device mapper Document,device mapper thin provisioning snapshot使用方式大概分为以下几步:

    准备data与metadata device,可以是实际的物理设备或LVM(loop-lvm 模式在生产环境一般不用)。data device用来存放实际的数据,metadata device 用来存储元数据信息。利用data,metadata device创建一个thin pool (即thinp): dmsetup create poolname --table "0 20971520 thin-pool $metadata_dev $data_dev $data_block_size $low_water_mark"创建对应的thinly-provisioned volume创建snapshots并mount

创建完成后可以通过dmsetup status看到相关信息,docker自己创建的thinpool信息如下:

[root@gaorong-pc ~]# dmsetup status vg_root-dmdata: 0 419430400 linear vg_root-dmmeta: 0 62914560 linear docker-253:2-812-pool: 0 419430400 thin-pool 65465 11492/4161600 581965/3276800 - rw no_discard_passdown queue_if_no_space - docker-253:2-812-1e1c90db3592bb7cca6df78a7f823db3ba53420640be5a4c62893bfbf6d2527b: 0 20971520 thin 236288 20971519.....

可以看到有data, metadata device, thin pool, thin volume对象,其中thinpool的输出含义为: start_sector sector_num device_type transaction_id used_metadata_blocks/total_metadata_blocks used_data_blocks/total_data_blocks held_metadata_root ro|rw|out_of_data_space [no_]discard_passdown [error|queue]_if_no_space needs_check|- metadata_low_watermark 各个字段具体含义参见device mapper thin-provisioning

Device Mapper在docker中的应用

docker使用devicemapper storage driver会自动完成上述对象的创建,将image和conainer layer信息存储在thinpool中,并mount到/var/lib/docker/devicemapper/目录下暴露给container使用,其中metadata目录下包含了各个layer的snapshot的信息,他会为每个layer创建一个文件来记录信息,如下:

[root@gaorong-pc devicemapper]# cat metadata/1e1c90db3592bb7cca6df78a7f823db3ba53420640be5a4c62893bfbf6d2527b{"device_id":32867,"size":10737418240,"transaction_id":65437,"initialized":false,"deleted":false}

容器的writable layer是在真正启动运行的时候active, 对应的thin volume才能被dmsetup status可见。可以参看这篇文章了解更多Docker内部存储结构(devicemapper)解析(下篇)

data目录包含了各个container的mountpoint, 可以df命令看到每个container的mount 信息。thinpool的信息除了使用dmsetup指令查看外,也可以通过docker info直接输出:

[root@gaorong-pc ~]# docker infoContainers: 10 Running: 4 Paused: 0 Stopped: 6Images: 26Server Version: 17.03.2-ceStorage Driver: devicemapper Pool Name: docker-253:2-812-pool Pool Blocksize: 65.54 kB Base Device Size: 10.74 GB Backing Filesystem: xfs Data file: /dev/vg_root/dmdata Metadata file: /dev/vg_root/dmmeta Data Space Used: 38.14 GB Data Space Total: 214.7 GB Data Space Available: 176.6 GB Metadata Space Used: 47.07 MB Metadata Space Total: 17.05 GB Metadata Space Available: 17 GB Thin Pool Minimum Free Space: 21.47 GB Udev Sync Supported: false Deferred Removal Enabled: false Deferred Deletion Enabled: false Deferred Deleted Device Count: 0 Library Version: 1.02.82 (2013-10-04)Logging Driver: json-fileCgroup Driver: cgroupfs........

注意其中Thin Pool Minimum Free Space字段就是创建thinp时的$low_water_mark,它表示在当data device容量还剩下该阈值的时候就无法写入数据了,也就是docker info中 "Data Space Available","Thin Pool Minimum Free Space"两个字段相等时此时就无法写入数据了。在docker的官方文档里有详细介绍: How the devicemapper storage driver works

refs

docker官方介绍:Use the Device Mapper storage drivermoby repo: devicemapper - a storage backend based on Device Mapper 包含docker info dm 各个字段含义docker device mapper flag配置DOCKER基础技术:DEVICEMAPPER 左耳朵耗子出品, 五颗星剖析Docker文件系统:Aufs与Devicemapperdevice mapper Document 必看其中的thin-provisioning, snapshot两章,包含一些底层的使用方式,与参数细节dockercon 各种storage driver的使用: Deep dive into Docker storage drivers: video PPT

联系我们

联系人:

手 机:15825262313

邮 箱:l5krc88oc@162.com

公 司:yabo国际

地 址:江苏.苏州地区.张家港市金港镇后塍中华路工业区远达防爆