最近在官网上看了下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
相关推荐
devicemapper 存储驱动是 Docker 中最古老的存储驱动程序之一。devicemapper 有两种模式:loop-lvm 模式和 direct-lvm 模式。loop-lvm 模式虽然零配置,但是性能很差。direct-lvm 模式性能更好,但是需要更多的配置...
在存储部分,探讨了 Docker 的存储模型、常见的存储驱动(aufs、device mapper、overlay2、zfs)的原理,存储卷与数据持久化的方法,以及高级存储管理如存储卷管理、数据备份与恢复、存储驱动优化和最佳实践。...
yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。 device mapper Device Mapper 是 Linux2.6 内核中支持逻辑卷管理的通用设备映射机制,它为...
4. **Device Mapper**:基于设备映射的存储驱动,支持快照功能,适用于需要高级存储管理功能的场景。 5. **VFS (Virtual File System)**:通用文件系统,适用于任何类型的文件系统,但通常不是最优选择。 6. **ZFS**...
接着,卸载旧版本的Docker(如果有),然后安装所需的依赖包,包括yum-utils、device-mapper-persistent-data和lvm2。设置Docker的yum源,添加阿里云的Docker CE仓库,列出所有可用版本并选择安装。启动Docker服务并...
2. **Docker守护进程启动失败**:如果在启动Docker守护进程时遇到“Error starting daemon”错误,可能是由于存在多个有效的存储驱动器,例如aufs和devicemapper。要解决这个问题,需要清理或明确选择存储驱动器...
所有Docker映像都是使用诸如AUFS,OverlayFS和Device Mapper之类的存储驱动程序(图形驱动程序)由层构成的。 作为设计原则,LCFS以一流公民的身份着重于分层。 与合并单独的文件系统相反,LCFS文件系统直接在块
5. **存储驱动**: Boot2Docker支持多种存储驱动,如aufs、overlay2、devicemapper等,可以根据用户需求选择最适合的存储方案。 6. **安全性和更新**: 作为Docker的配套工具,Boot2Docker定期发布新版本以保持与...
这些依赖可能包括`yum-utils`(用于处理软件包依赖关系),`device-mapper-persistent-data`和`lvm2`(Docker需要的存储驱动)。在命令行输入以下命令: ``` sudo yum install -y yum-utils device-mapper-...
例如,`libseccomp`库对于Docker的安全策略至关重要,而`device-mapper`驱动则是Docker存储驱动的基础。在RHEL 6上安装这些依赖可能需要手动操作或使用第三方仓库。 文件列表中的`readme`文件通常会包含安装步骤的...
3. 安装了`device-mapper-persistent-data`和`lvm2`,因为Docker需要这些驱动程序来管理其存储驱动。安装命令:`sudo yum install -y device-mapper-persistent-data lvm2` 接下来,我们使用离线安装步骤: 1. 将...
1. 在主机上安装必要的系统工具,例如`yum-utils`,`device-mapper-persistent-data`和`lvm2`。这些工具对于后续的Docker安装和管理至关重要。如果服务器无法访问互联网,你可以从其他有网络的机器下载RPM包,然后...
sudo yum install -y yum-utils device-mapper-persistent-data lvm2 ``` 3. 添加Docker的官方GPG密钥: ```bash sudo yum-config-manager --add-repo ...
在安装Docker之后,你可能还需要配置相关的服务和设置,例如创建Docker用户组,启动并设置Docker服务开机启动,以及设置Docker的存储驱动(如devicemapper)。此外,你可以编写额外的脚本来自动化这些任务,以实现...
如`yum-utils`(用于处理包管理和仓库操作)、`device-mapper-persistent-data`和`libdevmapper`(用于设备映射器支持,这是Docker存储驱动的一部分),以及`git`(如果需要从GitHub等源码仓库安装或更新Docker)。...
7. **存储驱动**:Docker 支持多种存储驱动,如aufs、overlay2、devicemapper等。源码分析会揭示 Docker-oo 如何选择和使用这些驱动来持久化容器的数据。 8. **安全性和隔离**:Docker-oo 源码会展示如何利用 ...