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

docker的devicemapper存储驱动

 
阅读更多

最近在官网上看了下devicemapper的说明文档,这里简要总结一下。

1 诞生的背景

期初Docker是运行在Debian和Ubuntu系统上的,使用的是AUFS方式的存储。后来很多企业希望在Redhat系Linux上运行docker,并决定基于现有的Device Mapper技术开发一个新的存储方案,这就是devicemapper。

2 镜像的分层和共享

Device Mapper技术不是按照文件级别(file level),而是按块级别(block level)工作的,所以devicemapper也属于块级存储方案,有着thin provisioning和copy-on-write的特点。

  • thin provisioning 
    这个不知道该怎么翻译,网上叫自动精简配置的比较多(与此相对的传统的存储配置模型被称为厚存储配置FP),简单的说就是在需要的时候分配所需的最小空间(与此相对,传统的存储空间的分配都是超过目前的需求的,从而导致的一个问题就是存储利用率低下)。
  • copy-on-write 
    简单的理解就是,在内容发生变化的时候才进行内容复制。

devicemapper存储方式下的镜像

使用devicemapper存储生成镜像大致按照下面的流程: 
首先,devicemapper驱动从块设备创建一个小的存储池(a thin pool) 
然后,创建一个带有文件系统,如extfs等,的基础设备(base device) 
之后,每个新的镜像(或镜像层)都是base device的一个快照(snapshot)

devicemapper存储方式下的容器

devicemapper存储方式下,容器层都是从镜像生成的快照,快照里存储着所有对容器的更新。当数据被写入容器的时候,devicemapper按需从池中分配空间。

下面是官方文档中的一个说明图: 
这里写图片描述 
从上图可以看出,每个镜像层都是它下面一层的快照。每个镜像的最下面一层的镜像则是池中base device的快照。需要注意的是,base device属于Device Mapper的一部分,并不是docker的镜像层。

3 devicemapper下的读写

关于读

官网上读操作的说明图如下: 
这里写图片描述 
1)应用请求读取容器中的0x44f块区 
因为容器是镜像的一个简单快照,并没有数据只有一个指针,指向镜像层存储数据的地方。 
2)存储驱动根据指针,到镜像快照的a005e镜像层寻找0xf33块区 
3)devicemapper从镜像快照拷贝0xf33的内容到容器的内存中 
4)存储驱动最后将数据返回给请求的应用

关于写

当对容器中的大文件做一个小的改动的时候,devicemapper不会复制这整个文件,而是只拷贝被修改的块区。每个块区的大小为64KB。

  • 写新数据的情况 
    例如,写56KB大小的新数据到一个容器: 
    1)应用发出一个要写56KB的新数据到容器的请求 
    2)根据按需分配,将分配一个新的64KB的块区给容器的快照 
    如果写操作的数据大于64KB的话,将分配多个块区 
    3)之后,数据将被写入到新分配的块区中

  • 覆写已有的数据 
    每当容器第一次更新已有的数据时: 
    1)应用发出一个修改容器中数据的请求 
    2)copy-on-write操作将定位到需要更新的块区 
    3)然后分配新的空块区给容器快照,并复制数据到新分配的块区 
    4)接着,在有复制数据的新块区中进行数据修改 
    容器中的应用对发生的allocate-on-demand操作和copy-on-write操作是无感的

4 关于devicemapper的配置

Redhat系的linux发行版都采用devicemapper作为docker的默认存储驱动。目前,Debian,Ubuntu和Arch Linux也支持devicemapper。

devicemapper默认使用的是loop-lvm模式,这个模式使用sparse files来创建供镜像和容器快照使用的thin pool。然而,生产环境不要使用loop-lvm模式,官方建议使用direct-lvm模式。direct-lvm模式使用块设备(block devices)来创建thin pool。

假设/dev/mapper/docker-thinpool是已建好的lvm的逻辑卷,可以配置docker daemon的运行选项如下:

--storage-driver=devicemapper --storage-opt=dm.thinpooldev=/dev/mapper/docker-thinpool --storage-opt=dm.use_deferred_removal=true --storage-opt=dm.use_deferred_deletion=true
  • 1
  • 1

官方说设置dm.use_deferred_removal=true和dm.use_deferred_deletion=true选项可以防止unintentionally leaking mount points(没太明白什么意思,总之配了比不配好吧)。

devicemapper在主机上的结构

使用lsblk命令可以查看设备文件和devicemapper在设备文件上创建的pool: 
这里写图片描述 
对应上面接口的层次图如下: 
这里写图片描述 
可以看出,名为Docker-202:1-1032-pool的pool横跨在data和metadata设备之上。pool的命名规则为:

Docker-主设备号:二级设备号-inode号-pool

docker 1.10和以后的版本,在/var/lib/docker目录下不在采用镜像层ID来关联目录名了,有另外两个比较重要的目录: 
/var/lib/docker/devicemapper/mnt 包含镜像和容器层的挂载目录; 
/var/lib/docker/devicemapper/metadata 目录包含每个镜像层和容器快照的json格式的文件。

另外,当数据的逻辑卷要满的时候,可以给pool进行扩容,具体操作看官网。

5 关于devicemapper的性能

allocate-on-demand的性能影响

每当应用有新数据要写入容器时,都要从pool中去定位空的块区并映射给容器。因为所有块区都是64KB的,小于64KB的数据也会分配一个块区;大于64B的数据则会分配多个块区。所以,特别是当发生很多小的写操作时,就会比较影响容器的性能。

copy-on-write的性能影响

每当容器第一次更新已有的数据时,devicemapper存储驱动都要执行copy-on-write操作。这个操作是从镜像快照复制数据到容器快照,这对容器性能还是有比较明显的性能影响的。当容器发生很多小64KB的写操作时,devicemapper的性能会比AUFS要差。

其它方面

1)所使用的mode 
默认情况下,devicemapper使用的是loop-lvm模式,这种模式使用的是sparse files,性能比较低。生产环境建议使用direct-lvm模式,这种模式存储驱动直接写数据到块设备。 
2)使用高速存储 
如果希望更好的性能,可以将Data file和Metadata file放到SSD这样的高速存储上。 
3)内存使用 
devicemapper并不是一个有效使用内存的存储驱动。当一个容器运行n个时,它的文件也会被拷贝n份到内存中,这对docker宿主机的内存使用会造成明显影响。因此,devicemapper存储驱动可能并不是PaaS和其它高密度使用型的最好选择。

对于写操作较大的,可以采用挂载data volumes。使用data volumes可以绕过存储驱动,从而不受thin provisioning和copy-on-write产生的负责影响。

 

http://blog.csdn.net/felix_yujing/article/details/54344251

分享到:
评论

相关推荐

    docker存储驱动

    devicemapper 存储驱动是 Docker 中最古老的存储驱动程序之一。devicemapper 有两种模式:loop-lvm 模式和 direct-lvm 模式。loop-lvm 模式虽然零配置,但是性能很差。direct-lvm 模式性能更好,但是需要更多的配置...

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

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

    device mapper与device-mapper-persistent-data 和 lvm2

    yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。 device mapper Device Mapper 是 Linux2.6 内核中支持逻辑卷管理的通用设备映射机制,它为...

    驾驭Docker的海洋:选择适合的存储驱动全攻略

    4. **Device Mapper**:基于设备映射的存储驱动,支持快照功能,适用于需要高级存储管理功能的场景。 5. **VFS (Virtual File System)**:通用文件系统,适用于任何类型的文件系统,但通常不是最优选择。 6. **ZFS**...

    docker安装skywalking+mysql

    接着,卸载旧版本的Docker(如果有),然后安装所需的依赖包,包括yum-utils、device-mapper-persistent-data和lvm2。设置Docker的yum源,添加阿里云的Docker CE仓库,列出所有可用版本并选择安装。启动Docker服务并...

    详解Docker源码编译安装

    2. **Docker守护进程启动失败**:如果在启动Docker守护进程时遇到“Error starting daemon”错误,可能是由于存在多个有效的存储驱动器,例如aufs和devicemapper。要解决这个问题,需要清理或明确选择存储驱动器...

    lcfs:适用于Docker的LCFS Graph驱动程序

    所有Docker映像都是使用诸如AUFS,OverlayFS和Device Mapper之类的存储驱动程序(图形驱动程序)由层构成的。 作为设计原则,LCFS以一流公民的身份着重于分层。 与合并单独的文件系统相反,LCFS文件系统直接在块

    boot2docker.iso的v18.05.0-ce版本

    5. **存储驱动**: Boot2Docker支持多种存储驱动,如aufs、overlay2、devicemapper等,可以根据用户需求选择最适合的存储方案。 6. **安全性和更新**: 作为Docker的配套工具,Boot2Docker定期发布新版本以保持与...

    docker安装包.zip

    这些依赖可能包括`yum-utils`(用于处理软件包依赖关系),`device-mapper-persistent-data`和`lvm2`(Docker需要的存储驱动)。在命令行输入以下命令: ``` sudo yum install -y yum-utils device-mapper-...

    docker在redhat6.5安装.zip

    例如,`libseccomp`库对于Docker的安全策略至关重要,而`device-mapper`驱动则是Docker存储驱动的基础。在RHEL 6上安装这些依赖可能需要手动操作或使用第三方仓库。 文件列表中的`readme`文件通常会包含安装步骤的...

    docker-离线安装包.zip

    3. 安装了`device-mapper-persistent-data`和`lvm2`,因为Docker需要这些驱动程序来管理其存储驱动。安装命令:`sudo yum install -y device-mapper-persistent-data lvm2` 接下来,我们使用离线安装步骤: 1. 将...

    Docker修改数据目录及相关配置.docx

    1. 在主机上安装必要的系统工具,例如`yum-utils`,`device-mapper-persistent-data`和`lvm2`。这些工具对于后续的Docker安装和管理至关重要。如果服务器无法访问互联网,你可以从其他有网络的机器下载RPM包,然后...

    centos下nvidia-docker2环境安装离线安装资料包

    sudo yum install -y yum-utils device-mapper-persistent-data lvm2 ``` 3. 添加Docker的官方GPG密钥: ```bash sudo yum-config-manager --add-repo ...

    centos6离线安装docker相关依赖包 及 自动安装脚本

    在安装Docker之后,你可能还需要配置相关的服务和设置,例如创建Docker用户组,启动并设置Docker服务开机启动,以及设置Docker的存储驱动(如devicemapper)。此外,你可以编写额外的脚本来自动化这些任务,以实现...

    redhat安装docker-ce依赖包

    如`yum-utils`(用于处理包管理和仓库操作)、`device-mapper-persistent-data`和`libdevmapper`(用于设备映射器支持,这是Docker存储驱动的一部分),以及`git`(如果需要从GitHub等源码仓库安装或更新Docker)。...

    docker-oo-源码.rar

    7. **存储驱动**:Docker 支持多种存储驱动,如aufs、overlay2、devicemapper等。源码分析会揭示 Docker-oo 如何选择和使用这些驱动来持久化容器的数据。 8. **安全性和隔离**:Docker-oo 源码会展示如何利用 ...

Global site tag (gtag.js) - Google Analytics