深入理解docker graph driver - DeviceMapper
进入正题之前
首先思考个问题,Docker并非第一个Linux容器解决方案,早在Docker之前就有Warden以及LXC等开源项目,为什么它们没这么火,无非都是上层包装和使用内核的ns以及cgroup,个人认为Docker在功能性上要比这两个项目走的更远一点,warden或者lxc总体上所做的工作相对简单,基于这两个开源项目去lanuch一个容器,开发者需要做大量的工作,包括准备/制作/发布镜像等。而这些工作Docker已经帮你做好了,个人认为Docker最大的卖点在于类似git一样的镜像版本管理和发布,而这部分实现的基础在于graphdriver。
graph driver是什么
这个事情我们要从头讲起...
所谓容器是什么,其实不过是一个普通进程,这个进程的特殊之处在于:
1)它可能是位于不同命名空间(ns)的,使进程加入不同的命名空间无非是使用clone/unshare/setns系统调用的其中一个,这个我们后续文章详细说明
2)它对资源的使用(cpu,memory,diskio等)可能受到CGroup资源控制的限制
封装这部分工作的逻辑在docker代码里命名是execdriver,具体实现可以是libcontainer(native方式)或者lxc
这个普通进程通过execdriver运行起来后如果希望他看起来像一个操作系统,那么我们需要一个rootfs,这个rootfs实际就是linux下/dev,/usr,/lib,/bin,/etc等文件目录结构,把这些东西打个包就是我们所说的镜像,Docker的graphdriver负责镜像本地的管理和存储以及对运行中的容器生成镜像等工作。
这个有一个比较重要的问题,如果一台机器上运行100个这样的容器进程,每个进程用的是同一个rootfs,每个容器运行过程中可能对这个rootfs有各自的修改,比如改个/etc下的配置,装个可执行文件到/bin目录,每个进程都是这样的小修改,如果在主机上存储100份这个rootfs的拷贝,那么存储空间的浪费是巨大的,这时我们会希望系统只保存一份rootfs,然后每个容器共享这个拷贝,如果某个容器需要修改,则能够通过CoW机制只保存该容器修改的部分,之后针对这个容器如果需要生成镜像,则只需要计算和保存修改的部分与原有rootfs的差异,这样通过层层叠加的方式来管理整个镜像系统。实际上docker的graphdriver里面除了vfs外的其它驱动都是按这个方式工作的。
graph driver的选择
Docker提供的graphdriver主要有btrfs,aufs,overlayfs(3.18以上kernel支持),devicemapper,vfs
我们逐个分析下:
btrfs文件系统本身支持快照功能,可以实现我们的需求,但是btrfs本身貌似目前还没有productionready
aufs文件系统是叠合文件系统,专门为了解决这种问题而生,可惜因为代码质量问题,一直被linus拒之门外,这样在很多发行版里都不会默认安装,用户使用需要自己编译对非kernel维护人员来说也比较麻烦。
overlayfs文件系统也是叠合文件系统,但是需要3.18以上kernel版本,目前貌似stable的主流Linux发行版都还没到这个内核版本
结论是如果没有自己的kernel团队,那么目前唯一的选择似乎就是devicemapper了。
device mapper是什么
简单的说devicemapper是位于内核通用块blocklayer部分的一个抽象层,帮助上层完成一些IO策略的灵活定制,在内核IO协议栈的层次关系如图:
实际上devicemapper相当于帮你做好了一个虚拟块设备,盘符路径是在/dev/mapper/下,然后你来写一段内核代码,这段代码来定制你这个虚拟块设备的IO行为,这段代码模块就是devicemapper target,而devicemapper本身相当于一个框架,当然内核本身已经用这个框架实现了一些target,比如dm-raid1镜像target可以帮你完成设备的软raid1,dm-snap可以完成设备的快照,我们后续用的的也是内核实现好的target,分别是dm-thin和dm-pool,另外早期facebook开源的flashcache也是基于devicemapper开发。
现在我们来梳理下dm这个框架做的事情,逻辑如图:
devicemapper设备在内核里通过mapped_device数据结构标识,代表一个虚拟的块设备,上层的读写请求进入blocklayer后会转变成bio数据结构,跟据所写的设备盘符找到相应的mapped_device,然后根据所写入bio的扇区信息查找一个叫dm_table的数据结构,该数据结构维护一个设备IO信息映射表,简单的说就是类似从多少扇区到多少扇区应用什么规则,而这个规则就是dm_target,我们具体写一个dm的target时就是来填充这个dm_target(具体里面有一个target_type的数据结构,提供众多回调方法来灵活处理bio)提供的一些回调方法,之后上层的请求过来就可以按我们的规则完成指定的动作了。
最终我们的代码通过不同返回值来告知dm框架是否已处理完这个bio,如果处理完则框架会向上层返回io处理结果,或者我们可以通过修改bio的设备信息和扇区信息来完成io的重定向,也就是remap。
篇幅所限先写到这里,该篇整体算是一个引言,内容相对粗浅,后续会由浅入深
深入理解docker graph driver - DeviceMapper相关推荐
- 土法搞docker系列之自制docker的graph driver vdisk
写在最前 偶然整理,翻出来14年刚开始学docker的时候的好多资料.当时docker刚刚进入国内,还有很多的问题.当时我们的思考方式很简单,docker确实是个好的工具,虽然还不成熟.但是不能因为短 ...
- Docker storage driver(十四)
一.storage driver 作用 正常情况下,只有很少量的数据被写入到容器最上层的写入层,并且通过 volume 来写数据,然而我们也会遇到一些情况需要我们可以直接写入到容器的写入层,这我们就需 ...
- 10张图带你深入理解Docker容器和镜像
本文用图文并茂的方式介绍了容器.镜像的区别和Docker每个命令后面的技术细节,能够很好的帮助读者深入理解Docker. 这篇文章希望能够帮助读者深入理解Docker的命令,还有容器(containe ...
- DockerONE 干货 深入理解Docker容器和镜像
这篇文章希望能够帮助读者深入理解Docker的命令,还有容器(container)和镜像(image)之间的区别,并深入探讨容器和运行中的容器之间的区别. 当我对Docker技术还是一知半解的时候,我 ...
- 10 张图带你深入理解Docker容器和镜像
此文中部分信息.图片需要 fan qiang , 如果未能正常显示,文末有原文连接 . [Kubernetes培训通知]DockOne将会于2018年5月18日在上海举办Kubernetes技术培训, ...
- Docker storage driver 选择
2019独角兽企业重金招聘Python工程师标准>>> Docker storage driver 选择 博客分类: docker 本文的目的是说明,如何在生产环境中选择Docker ...
- Docker存储驱动devicemapper介绍和配置
一.devicemapper介绍 1 2 3 4 5 6 7 8 9 Device Mapper是Linux系统中基于内核的高级卷管理技术框架.Docker的devicemapper存储驱动就是基于该 ...
- Docker--10张图带你深入理解Docker容器和镜像
这篇文章希望能够帮助读者深入理解Docker的命令,还有容器(container)和镜像(image)之间的区别,并深入探讨容器和运行中的容器之间的区别. 当我对Docker技术还是一知半解的时候,我 ...
- 10张图带你深入理解Docker容器和镜像--云平台技术栈07
导读:之前发布了云平台技术栈(ps:点击可查看),本文主要说一下其中的Docker! 翻译:杨润青 这篇文章希望能够帮助读者深入理解Docker的命令,还有容器(container)和镜像(image ...
最新文章
- 在Qt4中使用QPersistentModelIndex传递QModelIndex
- oracle导入时提示IMP-00010:不是有效的导出文件,头部验证失败
- LeetCode Decode String(栈和递归)
- 7-36 社交网络图中结点的“重要性”计算 (30 分)(思路加详解)兄弟们PTA乙级题目冲起来
- Oracle 练习题 20131017
- Docker的Solomon Hykes在OSCON上的主题演讲的要点
- error: failed to push some refs to ‘github.com:English.git‘ hint: Updates w
- i++与++i的区别+汇编分析
- 8.4完成服务(Completion Services)
- 大师兄科研网_拜托啦,师兄!
- 广东高等学校计算机水平考试准考证打印,广东高考准考证打印系统
- 手写一个识别旺旺/千牛,手机在线/电脑在线状态的小工具
- 人工智能如何自我进化
- 二十个不可不知的 TSM 知识点
- 数据库系统概念 - 数据模型,关系模型,关系,候选码,主码,外码
- P0.9COB小间距LED显示技术的优势。
- 启科量子可视化量子编程——QuComposer
- python 习题练习一
- Elasticsearch学习笔记:MUST_NOT not working with EXIST in NESTED query
- Spock in Java 慢慢爱上写单元测试