分享

docker存储结构解析

gefieder 发表于 2015-4-12 22:01:43 [显示全部楼层] 只看大图 回帖奖励 阅读模式 关闭右栏 1 19737
本帖最后由 nettman 于 2015-4-12 22:51 编辑
问题导读:
1、
创建一个apache容器时devicemapper处理流程是什么?
2.docker服务在启动的时候可以配置devicemapper的启动有哪些参数?
3.docker服务在启动的时候如何配置devicemapper的启动参数?



由于aufs并未进入内核,故而目前只有Ubuntu系统上能够使用aufs作为docker的存储引擎,而其他系统上使用lvm thin provisioning(overlayfs是一个和aufs类似的union filesystem,未来有可能进入内核,但目前还没有;Lvm snapshot are useful for doing e.g. backup of a snapshot, but regress badly in performance when you start having many snapshots of the same device.)。为了实现lvm thin provisioning,docker启动时会设置一个100G的sparse文件(/var/lib/docker/devicemapper/devicemapper/data,元数据为/var/lib/docker/devicemapper/devicemapper/metadata),并将其作为devicemapper的存储池,而所有容器都从该存储池中分配默认10G的存储空间使用,如下图所示:


20141118165633007.png
比如创建一个apache容器时devicemapper处理流程如下所示:

  1. Create a snapshot of the base device.
  2. Mount it and apply the changes in the fedora image.
  3. Create a snapshot based on the fedora device.
  4. Mount it and apply the changes in the apache image.
  5. Create a snapshot based on the apache device.
  6. Mount it and use as the root in the new container.
复制代码



1、thin provisioning管理
1)、使用lvm工具来创建一个thin pool:
  1. dd if=/dev/zero of=lvm.img bs=1M count=100
  2. losetup /dev/loop7 lvm.img
  3. losetup -a
  4. pvcreate /dev/loop7
  5. vgcreate lvm_pool /dev/loop7
  6. # create thin pool
  7. lvcreate -L 80M -T lvm_pool/thin_pool
  8. # create volume in thin pool
  9. lvcreate -T lvm_pool/thin_pool -V 500M -n first_lv
复制代码

2)、docker启动时创建的默认存储池:
  1. #dmsetup table docker-253:1-138011042-pool
  2. 0 209715200 thin-pool 7:2 7:1 128 32768 1 skip_block_zeroing    # 209715200*512/1024/1024/1024=100GB
复制代码
当启动容器后,会从该池中分配10G出来:
  1. #dmsetup table docker-253:1-138011042-641cdebd22b55f2656a560cd250e661ab181dcf2f5c5b78dc306df7ce62231f2
  2. 0 20971520 thin 253:2 166    # 20971520*512/1024/1024/1024=10GB
复制代码
该10G存储的分配过程为:
  1. dmsetup message /dev/mapper/docker-253:1-138011042-pool 0 "create_thin 166"
  2. dmsetup create docker-253:1-138011042-641cdebd22b55f2656a560cd250e661ab181dcf2f5c5b78dc306df7ce62231f3 --table "0 20971520 thin /dev/mapper/docker-253:1-138011042-pool 166"
复制代码

3)、创建快照:
  1. dmsetup suspend /dev/mapper/thin
  2. dmsetup message /dev/mapper/yy_thin_pool 0 "create_snap 1 0"
  3. dmsetup resume /dev/mapper/thin
  4. dmsetup create snap --table "0 40960 thin /dev/mapper/yy_thin_pool 1"
复制代码
docker服务在启动的时候可以配置devicemapper的启动参数,docker -d --storage-opt dm.foo=bar,可选参数有以下几个:
  • dm.basesize 默认为10G,限制容器和镜像的大小
  • dm.loopdatasize 存储池大小,默认为100G
  • dm.datadev 存储池设备,默认生成一个/var/lib/docker/devicemapper/devicemapper/data文件
  • dm.loopmetadatasize 元数据大小,默认为2G
  • dm.metadatadev 元数据设备,默认生成一个/var/lib/docker/devicemapper/devicemapper/metadata文件
  • dm.fs 文件系统,默认ext4
  • dm.blocksize blocksize默认64K
  • dm.blkdiscard 默认true

2、最后看看启动一个容器后,该容器的配置是如何组织的。
每个容器创建后都会将其基本配置写入到/var/lib/docker/containers/中:
  1. #ls /var/lib/docker/containers/49f19ee979f6bf125c62779dcabf3bdce310b13d22e5c826752db202e509154e -l
  2. total 20
  3. -rw------- 1 root root 0 Nov 18 16:31 49f19ee979f6bf125c62779dcabf3bdce310b13d22e5c826752db202e509154e-json.log
  4. -rw-r--r-- 1 root root 1741 Nov 18 16:31 config.json
  5. -rw-r--r-- 1 root root 368 Nov 18 16:31 hostconfig.json
  6. -rw-r--r-- 1 root root 13 Nov 18 16:31 hostname
  7. -rw-r--r-- 1 root root 175 Nov 18 16:31 hosts
  8. -rw-r--r-- 1 root root 325 Nov 18 16:31 resolv.conf
复制代码
分配10G空间后会将容器存储配置写入到以下两个文件中:
  1. # cd /var/lib/docker
  2. #cat ./devicemapper/metadata/49f19ee979f6bf125c62779dcabf3bdce310b13d22e5c826752db202e509154e-init
  3. {"device_id":174,"size":10737418240,"transaction_id":731,"initialized":false}
  4. #cat ./devicemapper/metadata/49f19ee979f6bf125c62779dcabf3bdce310b13d22e5c826752db202e509154e
  5. {"device_id":175,"size":10737418240,"transaction_id":732,"initialized":false}
复制代码
而容器的rootfs会mount到/var/lib/docker/devicemapper/mnt/container_id下:
  1. #mount | grep 49f1
  2. /dev/mapper/docker-253:1-138011042-49f19ee979f6bf125c62779dcabf3bdce310b13d22e5c826752db202e509154e on /var/lib/docker/devicemapper/mnt/49f19ee979f6bf125c62779dcabf3bdce310b13d22e5c826752db202e509154e type ext4 (rw,relatime,discard,stripe=16,data=ordered)
复制代码

来源:
feisky



欢迎加入about云群371358502、39327136,云计算爱好者群,亦可关注about云腾讯认证空间||关注本站微信

已有(1)人评论

跳转到指定楼层
awenkidz 发表于 2015-4-13 08:36:23
好资料。。。收了。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条