当前位置: 首页 > 编程日记 > 正文

docker的分层

docker的分层

Contents

  • docker的层
  • docker的层是怎么来的
  • docker是如何区分这些层
    • docker镜像是如何区分这些层的
    • docker的层在本地的存储
      • vfs
      • devicemapper

docker的层

在这里,我们首先做一个样例,样例设定为一个镜像D。当然,这个D镜像不是单层,而是从其他层继承来的。

继承关系如下所示:

─a  Virtual Size:10 KB└─b Virtual Size: 10 MB└─c Virtual Size: 100 MB└─d Virtual Size: 200 MB

D镜像由a/b/c/d四层组成,我们以最后一层的大写来称谓这个镜像,叫他D镜像。同理,a/b/c三层组成的镜像就是C镜像。

docker的层是怎么来的

层嘛,当然是一层层堆叠起来的。

具体来说,就是比如你现在有了一个C的镜像,然后你打算在上面增加一个软件,比如tomcat。那么你无论是通过Dockerfile,异或是通过创建一个C的实例容器,然后commit出来,这个时候你就可以得到一个新的镜像D。镜像D除了有镜像C之外,还有一部分新增的内容。所以这就有了新的一层d。以此类推,就有了诸多的层。

docker是如何区分这些层

docker如何区分这些层,我们从两个角度来看,一个角度,是docker将这些层存储在了本地的graph里,并使之受自己的管理。根据不同的存储driver,当然会有一些细节的不同,但是大同小异。我这里用vfs和devicemapper的driver作为举例。其他可以自己研习。另一个角度就是docker的镜像在导入导出时,进行层次的区分。

docker镜像是如何区分这些层的

先来介绍镜像是如何区分的,这样有利于理解在本地的存储。

还是刚刚的例子,D镜像有a/b/c/d四层。

那么我们以c和d两层作为样例来举例。

显然,镜像C和D的关系是C是D的parent层。

那么从C到D,其实无外乎有四种修改:

  • 增加了某文件(文件夹也可以看做是文件,下面统写为文件)
  • 删除了某文件
  • 修改了某文件
  • 某文件不变

好了,现在我们有了c镜像,然后如何来记录D镜像,也就是如何添加d层呢?显然,有一个假定就是从C到D,大部分文件都没有变化,所以只需要采用增量式记录就可以了。具体来说就是

  • 增加了某文件:则在d层中直接增加该文件。比如C中没有/d.txt,而在D中有,那么D中直接在根中加一个d.txt
  • 删除了某文件:在d中进行标注,比如删除了/c.txt,那么在D中,则生成一个/..c.txt的文件,表明这个文件已经奔删除了。
  • 修改了某文件:因为跟C中的文件不同了,同增加了某文件。
  • 某文件不变:C中有/a.txt,D中就不必再包含了。

这样就得到了d层。有了d层和C镜像,根据上面的规则反推,就可以得到一个完整的D镜像了。这就是分层的精髓。

docker的层在本地的存储

我们从一个镜像说起,我们现在得到了一个D镜像,里面已经有了a/b/c/d四个层。好了,我现在来分别存储。

因为存储的目标是为了后面进行使用,所以在本地存储,其实是为了得到四个完整的镜像。所以,我要在本地其实要存储A/B/C/D四个完整的镜像。

docker的镜像在本地的存储。因为具体驱动不同,所以最终实现的效果不相同。

vfs

vfs是采用全量的方式来存储镜像的。比如有a层,那么镜像A在vfs中存储有a层的所有文件。镜像B在vfs中将首先将a/b两层的文件进行拼合(前文已经叙述),得到拥有所有文件的完整镜像B,然后存在另一个目录中。以此类推。

vfs的这种方式,有个很大弊端,就是对于层次多的镜像,需要每次要拷贝很久。

比如本例中,A镜像,需要10KB;B镜像需要10MB;C镜像需要100MB,D镜像200MB。共需要310MB。

虽然D镜像较之于C镜像,只增加了d层,100MB的东西,但是在vfs中仍然要全部存储。

devicemapper

vfs之所以要存储全部,就是因为他没有联合的概念。与之相对的,就是devicemapper(dm)和aufs等联合文件系统在分层上表现出来的强大能力。

联合存储是一种很神奇的东西。他可以把不同目录下的文件融合到一个目录下。比如在目录dirA下有a.txt,dirB下有b.txt。联合文件系统可以对用户提供一个dir文件,里面包含了dirA和dirB下的内容,那么对于用户,就可以看到dir下有两个文件,a.txt和b.txt了。

在本例中,存储镜像A,是需要存储完整的a层。但是在存储镜像B时,可以利用a层和b层之间的关系,只需要存储增量部分的内容即可。同理,存储到了D镜像,只要存储较之于C增量的100MB。较之于vfs,节省了很大的空间。

具体的dm或者aufs的原理,就需要再去研究他们是如何实现的联合存储了。



来自为知笔记(Wiz)



转载于:https://www.cnblogs.com/ToBeSmart/p/4311249.html

相关文章:

《跟菜鸟学Cisco UC部署实战》-第 1 章 规划-课件(一共12章,免费)

链接:https://pan.baidu.com/s/1RiIphSUG5dsbPPqWaynHjQ 提取码:xjp9 复制这段内容后打开百度网盘手机App,操作更方便哦 《跟菜鸟学Cisco UC部署实战》-视频课程http://edu.51cto.com/course/10031.html 《Skype for Business Server 2015-企业外部-部署》视频课程http://ed…

UpdateDate()函数的作用

UpdateData(true); 用窗体上控件中的内容来更新和控件相关连的变量的值(只能更新value类型的变量) 例如:你在你的窗体中有一个Edit控件,为这个控件关联了CString类型的变量m_strName; 你在控件中添入内容之后&#xf…

1021 Deepest Root

要解决两大问题: 1. 数包含几个连通分量 2. 如何找到最深结点 注意:connected components的意思是连通分量 问题1我用并查集解决 问题2转化为如何得到每个结点的深度 值得注意之处是对于问题2来说,下图是测试用例1给出的树 可以看出从1…

一段处理百分数的js代码

function percent(s, e, i){s Number(s), isNaN(s) && (s "0");var n "%";return e !1 && (n ""), parseFloat((100 * s).toFixed(i)) n } s 需要处理的数字 e 是否显示百分号(%) true 或 false i 保留几位小数 转载于:h…

js字符串如何倒序

1. var reverse function( str ){ var newStr , i str.length; for(; i > 0; i--) { newStr str.charAt(i); } return newStr; };reverse(abcde) 2. var reverse function( str ){ return str.split().reverse().join(); }; 3.(类似法2) var rev…

Windows Phone 7 Tip (4) -- User Agent

The user agent for IE on Windows Phone 7 running on the Asus Galaxy device is:Mozilla/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.0; Trident/3.1; IEMobile/7.0) Asus;Galaxy6 source转载于:https://www.cnblogs.com/midshipman/archive/2010/04/29/1723416.html

vs2010 学习Silverlight学习笔记(7):控件样式与模板

概要: 终于知道Silverlight——App.xaml是干什么用的了,不仅可以用来封装样式(类似css),还可以制定控件模版。。。好强大的功能啊。 封装: 继续学习《一步一步学Silverlight 2系列(8&#xff09…

MinGW-notepad++开发c/c++程序

下载MinGW 点击下载 安装好后运行 最后点击左上角的 Installation,开始安装 1.编译: g -o a.exe a.cpp gcc -o hello.exe hello.c 2.运行: ./a.exe 转载于:https://www.cnblogs.com/feilongblog/p/4315636.html

re:Invent大会第四天:为什么Lambda值得你更多关注?

2018年11月29日的拉斯维加斯,AWS re:Invent大会进入第四天,上午照例由AWS CTO Werner Vogels带来主题演讲。 从主题演讲之前到主题演讲之后,改变最大的产品毫无疑问就是Lambda,有至少8个相关的最新发布。Vogels在2014年正式对外发…

1145 Hashing - Average Search Time

目录 思路 样例解释 AC代码 思路 要做出这道题必须直到除留余数法和平方探测法的原理。 除此之外有两个注意点: 1. 在查找时,如果当前位置上不是要找的数会继续找下去(如果k没超过表长的话),但是如果当前位置上是0,说明表里…

C#和Java的闭包-Jon谈《The Beauty of Closures》

第一段略。。。 大多数讲闭包的文章都是说函数式语言,因为它们往往对闭包的支持最完善。当你在使用函数式语言时,很可能已经清楚了解了什么是闭包,所以我想写一篇在经典OO语言出现的闭包有什么用处应该也是很合适的事情。这篇文章我准备讲一下…

谷歌浏览器输入框背景颜色变黄的解决方案

2019独角兽企业重金招聘Python工程师标准>>> input:-webkit-autofill, input:-webkit-autofill:hover, input:-webkit-autofill:focus { box-shadow:0 0 0 60px #eee inset; -webkit-text-fill-color: #878787; } 转载于:https://my.oschina.net/kitty0107/blog/296…

男人最不该做的7件事

1.没有目标 2.浪费时间 3.不独立 4.被动地活着 5.不规划自己的人生 6.不学习吸收信息 7.不接受爱情转载于:https://www.cnblogs.com/jiu0821/p/4315660.html

1085 Perfect Sequence

明确题目的核心是要找到 找到第一个满足 M > m*p 的M的下标。然后用该下标减去起点的下标即为序列元素个数。 二分区间应当是M所有可能的取值范围。起点是i1,终点是N而不是N-1,虽然A[N]上无元素。注意啊,原题要找的M是小于等于m*p的&…

[笔记]Go语言在Linux环境下输出彩色字符

Go语言要打印彩色字符与Linux终端输出彩色字符类似,以黑色背景高亮绿色字体为例: fmt.Printf("\n %c[1;40;32m%s%c[0m\n\n", 0x1B, "testPrintColor", 0x1B) 其中0x1B是标记,[开始定义颜色,1代表高亮&#xf…

javascript中this那些事

定义 this是函数执行的上下文。 调用方式 1. 作为函数调用,指向window(严格模式报undefined的错)。 var namehello; function a() { console.log(this.name) } a(); //hellovar c{ name:haha, d: function(){ a(); } } c.d(…

java序列化的作用-这个挺有用的,不妨学学

http://bbs.tech.ccidnet.com/read.php?tid249048 最近在阅读Core J2EE Patterns 的时候发现例子里用于在各个层次里进行传输的TO(Data Transfer Object)都实现了java.io.Serializable接口,看到这些偶突然感到茅塞顿开~困扰了很久…

二分法典例:木棒切割问题

Input : 输入木棒根数n,要得到的等长木棒数量K,以及n根木棒的长度。 Output : 等长木棒的最大长度。 用二分法求解这道题,首先要找到以得到的等长木棒数量为因变量、等长木棒长度为自变量函数。 int getK(int l){//随着l增大,返…

对Android 开发者有益的 40 条优化建议(转)

下面是开始Android编程的好方法: 找一些与你想做事情类似的代码 调整它,尝试让它做你像做的事情 经历问题 使用StackOverflow解决问题对每个你像添加的特征重复上述过程。这种方法能够激励你,因为你在保持不断迭代,不经意中你学到…

英语语法总结--连词

连词 连词是一种虚词, 它不能独立担任句子成分而只起连接词与词,短语与短语以及句与句的作用。连词主要可分为两类:并列连词和从属连词。并列连词用来连接平行的词、词组和分 句。如:and, but, or, nor, so, therefore, yet, howe…

开放平台鉴权以及OAuth2.0介绍

OAuth 2.0 协议 OAuth是一个开发标准,允许用户授权第三方网站或应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的内容。OAuth 2.0不兼容1.0。协议的参与者 RO (resource owner): 资源所有者&#xf…

1044 Shopping in Mars

这题我写了两个二分函数。 BS借用的模板是找到第一个大于等于总价的商品下标,然后返回的是钻石价值和减去商品总价,通过遍历来得到最小的差值,注意遍历的最后一个数字的时候可能会返回负值,所以只有当返回值大于等于0才可以用来竞…

nodeJS之eventproxy源码解读

1.源码缩影 !(function (name, definition) { var hasDefine typeof define function, //检查上下文环境是否为AMD或CMD hasExports typeof module ! undefined && module.exports; //检查上下文环境是否为Node if (hasDefine) { define(definition); //AMD环境或CM…

解决phpmyadmin3.4空密码登录被禁止登陆的方法

很多时候我们在本机测试时会将root用户密码设置为空。因为我把php升级到了5.3.1,以前的phpmyadmin版本不能用了,就升级到phpMyAdmin 3.2.4版的时候,会遇到无法以空密码登录root用户的情况。怎么解决呢? 请参照如下步骤: 1、打开程…

CentOS安装新版RabbitMQ解决Erlang 19.3版本依赖

2019独角兽企业重金招聘Python工程师标准>>> 通过yum等软件仓库都可以直接安装RabbitMQ,但版本一般都较为保守。 RabbitMQ官网提供了新版的rpm包(http://www.rabbitmq.com/download.html),但是安装的时候会提示需要erl…

1048 Find Coins(二分法解法)

非常基础的二分法-寻找序列中是否存在某一条件的元素 的应用 AC代码 #include<cstdio> #include<iostream> #include<set> #include<vector> #include<map> #include<algorithm>using namespace std;const int SUP 100000000; const in…

关于chrome等浏览器不支持showModalDialog的解决方案

目前&#xff0c;新版本的chrome和opera、Firefox等浏览器已经不支持showModalDialog方法。 如果是没有接收返回值的&#xff0c;可以直接将window.showModalDialog改为window.open。 需要接收返回值的情况&#xff1a; 父页面设置&#xff1a; var uIdName; function chooseus…

Flex Javascript 交互实现代码

关键字&#xff1a;ExternalInterface所用类库&#xff1a;SWFObject/*** Flex调用Javascript函数* params functionName:String Javascript函数名称* params ...params Javascript函数参数* return 返回Javascript函数的return内容**/ExternalInterface.call(functionName:Str…

C#反射使用时注意BindingFlags的用法(转载)

最近刚刚开始用反射做项目&#xff0c;遇到一个小的知识点&#xff0c;记录一下。 c#反射查找方法时&#xff0c;默认只能查到public方法。如果想要查找private方法&#xff0c;需要设定BindingFlags. 即&#xff1a; BindingFlags.Public|BindingFlags.Instance 默认…