首页 > docker的分层

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

更多相关:

  • 镜像打包工具clonezilla clonezilla 百度云盘链接:https://pan.baidu.com/s/1LOEPqNE9O0Z4QJmNExlgeA 提取码:zlso 使用方法: 1、将镜像直接烧入U盘 2、U盘启动...

  • Ubuntu iso镜像文件写入U盘   Ubuntu iso镜像文件写入U盘方法 分步指南   命令行输入  usb-creator-gtk如下:   3、Device 选择插入的U盘 4、image 选择镜像文件 5、make startup disk...

  • Docker将容器制作成镜像并提交到远程仓库 步骤如下 先在dockerhub上创建一个自己的用户https://hub.docker.com/。或者在阿里云也可以。      2. 然后先创建一个空的镜像名。   3. 在终端上登录。   4. 这里有一个容器ID为fe08a32503b1。想把它制作成镜像以备后期自己用。...

  • 本文来自 运维人生 ,作者:fly是个稻草人链接:http://www.ywadmin.com/?id=76误删除linux系统文件了?不用急,本文将给你一个恢复linux文件的方法,让你轻松应对运维中的各风险问题。方法总比问题多~说在前面的话针对日常维护操作,难免会出现文件误删除的操作。大家熟知linux文件系统不同win有回收...

  • 原文来自SecIN社区—作者:WiHat0x00 什么是WebShell渗透测试工作的一个阶段性目标就是获取目标服务器的操作控制权限,于是WebShell便应运而生。Webshell中的WEB就是web服务,shell就是管理攻击者与操作系统之间的交互。Webshell被称为攻击者通过Web服务器端口对Web服务器有一定的操作权限,而...

  • 断电时文件系统发生了什么?硬盘又发生了什么?下一次开机时写到一半的文件在系统层面还在吗?在底层还在吗?更进一步的, 文件系统如何保证事务性, 会不会存在某种极端情况导致例如最后几个bit还没写完, 文件系统却认为它成功了的情况?回答不限任何文件系统,谢谢!下面是「北极」的回复分享断电的一瞬间,很多事情是无法确定的:1. 你无法确定...

  • 接到项目需求。需要搭建一个页面进行交互,慢慢来b (2).jpg使用python django框架进行页面的搭建在项目文件下打开窗口,输入命令;django-admin startproject helloword#在文件helloword/helloword/创建view.py在view.py文件中输入以代码from django....

  • 常见的错误集合解决方案(一)No.1提示错误'Microsoft.VC90.CRT,version="9.0.21022.8"把Microsoft.NET Framework 3.5.1下面的全部勾选上。No.2解决Qt Designer设计的图标但是VS生成不显示问题描述:在Qt designer中为菜单栏和工具栏设计的图标,但是...

  • Bigtable 可以说是log-structed以及page-oriented 两种存储引擎的整合体,我们性能优越的单机存储引擎leveldb和rocksdb就是基于google的bigtable存储系统实现的。 论文地址Bigtable: A Distributed Storage System for Structured Da...

  • 一下为个人结合其他人对分布式存储 所需的技能进行总结,绘制成如下图谱,方便针对性学习。 这里对分布式存储系统接触较多的是ceph,所以在分布式存储系统分支上偏向ceph的学习。 如有分类有问题或者分支不合理,欢迎大家批评指正,目的是为了大家共同提升 文章目录分布式存储技能树Linux操作系统文件系统I/O系统I/O追踪内存管理Pag...

  • 存储过程存储过程分为系统存储过程和自定义存储过程存储过程通过将处理数据的程序从客户端应用程序移动到服务器,存储过程是放在服务器上的,通过客户端下达指令调用存储过程的时候,这个过程是在服务器上发生的,自然就不会占用网络的带宽就会降低网络流量。存储过程就是一组为了完成特定功能的T-SQL语句...

  • 原文地址:https://github.com/jaywcjlove/handbook/blob/master/MySQL/MySQL%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B.md MySQL数据类型 数字类型 整数: tinyint、smallint、mediumint、int、bigint浮点数:...

  • 为什么要用存储过程   几个去 IBM 面试的兄弟回来抱怨:去了好几个不同的 IBM 项目组,几乎每个面试官问到数据库的时候都要问用没用过存储过程,烦人不?大家去面的程序员,又不是 DBA,以前的项目都没有用到存储,不照样运行的好好的? 存储过程真的那么重要吗,它到底有什么好处呢? 笔者认为,存储过程说白了就是一堆 SQL 的合并。...