`
m635674608
  • 浏览: 5043021 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

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://www.cnblogs.com/feisky/p/4106212.html
 
参考文档
 
分享到:
评论

相关推荐

    Docker网络与存储技术详解及其应用场景

    在存储部分,探讨了 Docker 的存储模型、常见的存储驱动(aufs、device mapper、overlay2、zfs)的原理,存储卷与数据持久化的方法,以及高级存储管理如存储卷管理、数据备份与恢复、存储驱动优化和最佳实践。...

    Docker 1.7.0 深度解析.docx

    这个版本的发布不仅修正了大量的bug,还增强了Docker的架构,特别是网络模块和数据卷管理。 首先,Docker 1.7.0 引入了一项实验性的特性——支持out of process的数据卷插件。这意味着用户现在可以使用独立于Docker...

    容器化后台服务的艺术:Docker容器全解析

    5. **微服务架构**:Docker非常适合微服务架构,每个服务可以独立打包、部署和扩展。 6. **弹性伸缩**:容器可以快速启动和停止,适合实现应用的弹性伸缩。 7. **安全性**:容器提供了额外的隔离层,有助于提高应用...

    Docker Compose深度解析:多容器管理的艺术与实践

    5. **微服务架构**:Docker非常适合微服务架构,每个服务可以独立打包、部署和扩展。 6. **弹性伸缩**:容器可以快速启动和停止,适合实现应用的弹性伸缩。 7. **安全性**:容器提供了额外的隔离层,有助于提高应用...

    如何利用MongoDB存储Docker日志详解

    【MongoDB存储Docker日志详解】 在现代的分布式系统中,日志管理扮演着至关重要的角色,它能帮助我们追踪系统状态、诊断错误并快速解决问题。Docker作为流行的容器化平台,提供了多种日志管理策略,其中之一就是...

    elk的docker-compose配置

    ELK(Elasticsearch, Logstash, Kibana)是一个流行的日志管理和分析栈,用于收集、解析、存储和可视化各种日志数据。在本文中,我们将深入探讨如何使用Docker Compose来设置一个完整的ELK环境。Docker Compose是一...

    领科云基于Mesos和Docker的企业移动应用实践分享

    - **不适应Docker存储方式**:Docker容器的生命周期短暂,如何解决数据持久化问题。 - **Docker HA机制**:如何在容器层面实现高可用。 针对这些问题,领科云采取了一系列措施,比如使用CephFS作为统一存储,确保...

    实现跨宿主机多docker容器间数据共享

    这种架构非常适合于云环境下的存储需求,特别是在需要跨多个Docker容器或宿主机共享数据时。 #### 安装与配置GlusterFS集群 为了搭建GlusterFS集群,首先需要在三台CentOS 7的机器上完成以下步骤: 1. **配置主机...

    详解Docker的持久化存储和数据共享

    Data Volume 结构图 Docker持久化数据的方案 基于本地文件系统的Volume。可以再执行Docker create或Docker run时,通过-v参数将主机的目录作为容器的数据卷。这部分功能便是基本的本地文件系统的volume管理。 ...

    Docker数据存储之Bind mounts详解

    在Docker数据存储方案中,Bind mounts是一种非常实用的技术。它允许用户将宿主机(物理机或虚拟机)上的文件系统目录挂载到Docker容器中。简单地说,你可以通过Bind mounts让容器中的进程访问宿主机上的文件或目录,...

    探索Docker的插件宇宙:插件系统的工作原理全解析

    ### Docker 插件系统详解 #### 一、插件系统的概念与价值 Docker插件系统作为Docker的核心组成部分之一,极大地增强了Docker平台的功能性和灵活性。通过这一系统,开发者和运维人员能够根据实际需求定制并扩展...

    Docker守护进程连接故障全解析:诊断与妙手回春

    5. **微服务架构**:Docker非常适合微服务架构,每个服务可以独立打包、部署和扩展。 6. **弹性伸缩**:容器可以快速启动和停止,适合实现应用的弹性伸缩。 7. **安全性**:容器提供了额外的隔离层,有助于提高应用...

    docker教案.pdf

    4. 微服务架构:Docker鼓励采用面向服务的架构,每个容器运行单一应用程序,形成分布式应用程序模型,便于自动化部署和管理。 【总结】 Docker作为云时代的创新技术,通过轻量级的虚拟化方式,极大地提升了资源...

    MySQL+Docker搭建主从复制

    ### MySQL与Docker环境下搭建主从复制详解 在IT领域,数据库管理系统的高效稳定运行对于任何业务来说都至关重要。为了确保数据的安全性、可靠性和可用性,采用主从复制架构是一种常见且有效的策略。本文将详细介绍...

    破解重启难题:Docker容器无法重新启动的深度解析与应对策略

    5. **微服务架构**:Docker非常适合微服务架构,每个服务可以独立打包、部署和扩展。 6. **弹性伸缩**:容器可以快速启动和停止,适合实现应用的弹性伸缩。 7. **安全性**:容器提供了额外的隔离层,有助于提高应用...

    基于OpenStack的Docker开发

    【标题】"基于OpenStack的Docker开发"深入解析 在现代云计算环境中,Docker和OpenStack已经成为两个不可或缺的关键技术。Docker以其轻量级容器化能力,为开发者提供了便捷的软件部署和管理方式;而OpenStack作为一...

Global site tag (gtag.js) - Google Analytics