Docker底层存储结构

本文详细介绍了Docker在非Ubuntu系统上使用lvm thin provisioning作为存储引擎的原理。通过创建和管理thin pool,以及在启动容器时如何分配存储空间,展示了devicemapper的工作流程。此外,还提到了docker启动时可配置的devicemapper参数,以及容器创建后的配置组织结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Docker底层存储结构 由于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的存储空间使用,如下图所示:
 

比如创建一个apache容器时devicemapper处理流程如下所示:
 Create a snapshot of the base device.
 Mount it and apply the changes in the fedora image.
 Create a snapshot based on the fedora device.
 Mount it and apply the changes in the apache image.
 Create a snapshot based on the apache device.
 Mount it and use as the root in the new container.
thin provisioning管理 使用lvm工具来创建一个thin pool: #dd if=/dev/zero of=lvm.img bs=1M count=100 #losetup /dev/loop7 lvm.img #losetup -a #pvcreate /dev/loop7 #vgcreate lvm_pool /dev/loop7 ### 创建 thin pool #lvcreate -L 80M -T lvm_pool/thin_pool ### create volume in thin pool #lvcreate -T lvm_pool/thin_pool -V 500M -n first_lv docker启动时创建的默认100G存储池 扇区: 209715200*512/1024/1024/1024=100GB #dmsetup table docker-253:1-138011042-pool 0 209715200 thin-pool 7:2 7:1 128 32768 1 skip_block_zeroing
当启动容器后,会从该池中分配10G出来 扇区: 20971520*512/1024/1024/1024=10GB #dmsetup table docker-253:1-138011042-641cdebd22b55f2656a560cd250e661ab181dcf2f5c5b78dc306df7ce62231f2 0 20971520 thin 253:2 166 该10G存储的分配过程为: #dmsetup message /dev/mapper/docker-253:1-138011042-pool 0 "create_thin 166" #dmsetup create docker-253:1-138011042-641cdebd22b55f2656a560cd250e661ab181dcf2f5c5b78dc306df7ce62231f3 --table "0 20971520 thin /dev/mapper/docker-253:1-138011042-pool 166" 创建快照: dmsetup suspend /dev/mapper/thin dmsetup message /dev/mapper/yy_thin_pool 0 "create_snap 1 0" dmsetup resume /dev/mapper/thin 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
最后看看启动一个容器后,该容器的配置是如何组织的。 每个容器创建后都会将其基本配置写入到/var/lib/docker/containers/中:
分配10G空间后会将容器存储配置写入到以下两个文件中: # cd /var/lib/docker/devicemapper/metadata

而容器的rootfs会mount到/var/lib/docker/devicemapper/mnt/container_id下: #mount


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值