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处理流程如下所示:

  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.

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

# create 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启动时创建的默认存储池:

#dmsetup table docker-253:1-138011042-pool

0 209715200 thin-pool 7:2 7:1 128 32768 1 skip_block_zeroing    # 209715200*512/1024/1024/1024=100GB

当启动容器后,会从该池中分配10G出来:

#dmsetup table docker-253:1-138011042-641cdebd22b55f2656a560cd250e661ab181dcf2f5c5b78dc306df7ce62231f2

0 20971520 thin 253:2 166    # 20971520*512/1024/1024/1024=10GB

该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,可选参数有以下几个:

  1. dm.basesize 默认为10G,限制容器和镜像的大小
  2. dm.loopdatasize 存储池大小,默认为100G
  3. dm.datadev 存储池设备,默认生成一个/var/lib/docker/devicemapper/devicemapper/data文件
  4. dm.loopmetadatasize 元数据大小,默认为2G
  5. dm.metadatadev 元数据设备,默认生成一个/var/lib/docker/devicemapper/devicemapper/metadata文件
  6. dm.fs 文件系统,默认ext4
  7. dm.blocksize blocksize默认64K
  8. dm.blkdiscard 默认true

最后看看启动一个容器后,该容器的配置是如何组织的。

每个容器创建后都会将其基本配置写入到/var/lib/docker/containers/中:

#ls /var/lib/docker/containers/49f19ee979f6bf125c62779dcabf3bdce310b13d22e5c826752db202e509154e -l

total 20

-rw------- 1 root root 0 Nov 18 16:31 49f19ee979f6bf125c62779dcabf3bdce310b13d22e5c826752db202e509154e-json.log

-rw-r--r-- 1 root root 1741 Nov 18 16:31 config.json

-rw-r--r-- 1 root root 368 Nov 18 16:31 hostconfig.json

-rw-r--r-- 1 root root 13 Nov 18 16:31 hostname

-rw-r--r-- 1 root root 175 Nov 18 16:31 hosts

-rw-r--r-- 1 root root 325 Nov 18 16:31 resolv.conf

分配10G空间后会将容器存储配置写入到以下两个文件中:

# cd /var/lib/docker

#cat ./devicemapper/metadata/49f19ee979f6bf125c62779dcabf3bdce310b13d22e5c826752db202e509154e-init
{"device_id":174,"size":10737418240,"transaction_id":731,"initialized":false}
#cat ./devicemapper/metadata/49f19ee979f6bf125c62779dcabf3bdce310b13d22e5c826752db202e509154e 
{"device_id":175,"size":10737418240,"transaction_id":732,"initialized":false}

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

#mount | grep 49f1

/dev/mapper/docker-253:1-138011042-49f19ee979f6bf125c62779dcabf3bdce310b13d22e5c826752db202e509154e on /var/lib/docker/devicemapper/mnt/49f19ee979f6bf125c62779dcabf3bdce310b13d22e5c826752db202e509154e type ext4 (rw,relatime,discard,stripe=16,data=ordered)

参考文档

http://blogs.gnome.org/alexl/2013/10/15/adventures-in-docker-land/

http://www.cnblogs.com/hustcat/p/3908985.html

https://hustcat.github.io/docker-devicemapper2/

https://github.com/docker/docker/tree/master/daemon/graphdriver/devmapper

时间: 2024-12-20 23:50:44

docker存储结构解析的相关文章

VSAN存储结构解析;存储数据恢复的成功案例分享

今天给大家介绍一的是一款常见存储设备-Vsan的结构原理,相对而言技术性文字较多.VSAN是一种以vSphere内核作为基础开发出来的一款可以扩展使用的分布式存储架构.这款存储在vSphere集群主机中安硬盘及闪存构建出VSAN存储层,通过存储进行管理与控制,最终形成一个共享存储层.伴随着计算机网络的快速发展,vsan的存储结构也在不断的更新换代过程中,传统的存储管理机制中的底层存储不了解虚拟化和文件系统,新一代的存储管理机制将更新为基于对象存储系统.虚拟数据存储.分布式存储.下图为vsan的存

Java的HashMap键值对存储结构解析

容器总体结构 Map存储键值对的数据结构是“数组+链表”的结构,结合了数组查询数据快和链表增删数据快的优点:用Entry[]存储键值对,Entry为类类型,类里面有四个属性:hash.K.V.next,分别存储哈希值.键对象.值对象.下一个Entry对象引用. Entry底层源码 Entry对象存储结构图 Entry数组存储结构图 HashMap存储数据过程示意图 我们的目的是将”key-value两个对象”成对存放到HashMap的Entry[]数组中.参见以下步骤: (1) 获得key对象的

Docker底层存储结构

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

SQLServer2012 表IAM存储结构探究

SQLServer2012 表IAM存储结构探究 Author:zfive5(zidong) Email: [email protected] 引子 国庆节期间,一直在翻阅<程序员的自我修养-链接.装载与库>,这本给我的感觉是越看越乱,但总的来说还不错,一句话--优秀程序员就应该知道每一个字节的意义. 看此书前的两本<深入解析SQLServer2008>和<Microsoft SQL Server 2005技术内幕:存储引擎>对IAM解读都是点到为止,让我满脑袋是一堆问

Docker存储驱动之Device Mapper简介

Device Mapper是一个基于kernel的框架,它增强了很多Linux上的高级卷管理技术.Docker的devicemapper驱动在镜像和容器管理上,利用了该框架的超配和快照功能.为了区别,本文使用Device Mapper指驱动中的框架,而devicemapper指Docker的存储驱动. 注意:商业支持的Docker Engine(CS-Engine)建议在RHEL和CentOS上使用devicemapper存储驱动. AUFS之外的另一种选择 Docker最初运行在Ubuntu和

SQL SERVER大话存储结构(2)

阅读目录(Content) 1 行记录如何存储 1.1 堆表 1.2 聚集索引表格 2 非聚集索引结构 3 非聚集索引键值内容 3.1 堆表上的非聚集索引 3.2 聚集索引表(唯一)的非聚集索引 3.3 聚集索引表(非唯一)的非聚集索引 4 非聚集索引如何查找页 如果转载,请注明博文来源: www.cnblogs.com/xinysu/   ,版权归 博客园 苏家小萝卜 所有.望各位支持! 本系列上一篇博文链接:SQL SERVER大话存储结构(1)_数据页类型及页面指令分析 回到顶部(go t

SQL SERVER大话存储结构(3)

阅读目录(Content) 1 引入 2 数据行 2.1 数据行结构 2.2 特殊情况(大对象.行溢出及forword) 2.2.1 大对象 2.2.2 行溢出 2.2.3 forword 3 测试存储情况 3.1 堆表分析 3.2 添加主键 3.3 增加一列:可空变长列 3.4 增加一列:非空变长列+默认值 3.4.1 非大对象列 3.5 删除无数据的列 3.6 删除有数据的列 3.7 行溢出 3.8 Forword 4 行结构与DDL 一行数据是如何来存储的呢? 变长列与定长列,NULL与N

理解Docker(7):Docker 存储 - AUFS

(1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 (4)Docker 容器的隔离性 - 使用 cgroups 限制容器使用的资源 (5)Docker 网络 (6)若干企业生产环境中的容器网络方案 (7)Docker 存储 - AUFS Docker 存储可以分为分层文件系统和卷,本文将介绍 AUFS 分层文件系统. 1. 基础知识 1.1 Linux 的 rootfs 和 bootfs 一

Docker存储驱动之OverlayFS简介

简介 OverlayFS是一种和AUFS很类似的文件系统,与AUFS相比,OverlayFS有以下特性: 1) 更简单地设计: 2) 从3.18开始,就进入了Linux内核主线: 3) 可能更快一些. 因此,OverlayFS在Docker社区关注度提高很快,被很多人认为是AUFS的继承者.就像宣称的一样,OverlayFS还很年轻.所以,在生成环境使用它时,还是需要更加当心. Docker的overlay存储驱动利用了很多OverlayFS特性来构建和管理镜像与容器的磁盘结构. 自从Docke