1. 拉取镜像

首先我们先拉取镜像:


# docker pull ubuntu:latest
Using default tag: latestlatest: Pulling from library/ubuntu345e3491a907: Pull complete57671312ef6f: Pull complete5e9250ddb7d0: Pull completeDigest: sha256:adf73ca014822ad8237623d388cedf4d5346aa72c270c5acc01431cc93e18e2dStatus: Downloaded newer image for ubuntu:latestdocker.io/library/ubuntu:latest

这里的345e3491a907,57671312ef6f,5e9250ddb7d0为压缩的layer层的哈希值这些值为layerID,即distribution hashes,他们从远程的repository拉取下来。

2. 查看镜像详细信息

# docker inspect ubuntu:latest其中有一个rootfs的键值对,如下:"RootFS": {"Type": "layers","Layers": ["sha256:ccdbb80308cc5ef43b605ac28fac29c6a597f89f5a169bbedbb8dec29c987439",                "sha256:63c99163f47292f80f9d24c5b475751dbad6dc795596e935c5c7f1c73dc08107",                "sha256:2f140462f3bcf8cf3752461e27dfd4b3531f266fa10cda716166bd3a78a19103"]},

记住这里的rootfs layers的值是diffID。

3. layerID和解压后的diffID对应

那么从远程拉取下来的layerID和解压后的diffID是如何一一对应的呢?

# ls /var/lib/docker/image/overlay2/distribution/
diffid-by-digest  v2metadata-by-diffid

​其中diffid-by-digest保存了digest(layerID)->diffID的映射关系,即distribution hashes和Content hashes的映射关系。也即是正向查询。

v2metadata-by-diffid保存了diffid -> (digest,repository)的映射关系,这可以方便查找layer的digest及其所属的repository。也即是反向查询,可以从diffID->layerID(其实就是digest)。

# cd /var/lib/docker/image/overlay2/distribution/diffid-by-digest/sha256# cat <layerID><diffID> //得到 相对应的diffID# cd /var/lib/docker/image/overlay2/distribution/v2metadata-by-diffid/sha256# cat <diffID>[{"Digest":"sha256:345e3491a907bb7c6f1bdddcf4a94284b8b6ddd77eb7d93f09432b17b20f2bbe","SourceRepository":"docker.io/library/ubuntu","HMAC":""}]    // 得到相应的layerID和库相关信息

4. 从diffID组成chainID:

从diffID组成chainID:layer.ChainID只用本地,根据layer.DiffID计算,并用于layerdb的目录名称。chainID唯一标识了一组(像糖葫芦一样的串的底层)diffID的hash值,包含了这一层和它的父层(底层),当然这个糖葫芦可以有一颗山楂,也就是chainID(layer0)==diffID(layer0);对于多颗山楂的糖葫芦,ChainID(layerN) = SHA256hex(ChainID(layerN-1) + " " + DiffID(layerN))#cd /var/lib/docker/image/overlay2/layerdb/sha256这个sha256目录中保存了所有的chainID,在第二步对镜像的inspect中,["sha256:ccdbb80308cc5ef43b605ac28fac29c6a597f89f5a169bbedbb8dec29c987439",                "sha256:63c99163f47292f80f9d24c5b475751dbad6dc795596e935c5c7f1c73dc08107",                "sha256:2f140462f3bcf8cf3752461e27dfd4b3531f266fa10cda716166bd3a78a19103"]三个diffID,第一个是最底层的ccdbb80308cc5ef43b605ac28fac29c6a597f89f5a169bbedbb8dec29c987439,所以diffID(layer0)==chainID(layer0),然后这个文件夹中包含了diff、cache-id等,最主要的是Diff文件保存了这个层的diffID.cache-id为具体/var/lib/docker/overlay2/<cache-id>存储路径。另外两个chainID如何计算呢?除了底层的layer层,还有一些高层的layer,他们的chainID文件夹中包含了parent文件,这个是值为ChainID(layerN-1),diff文件存储了DiffID(layerN),而文件夹也就是ChainID(layerN) = SHA256hex(ChainID(layerN-1) + " " + DiffID(layerN))#echo -n "sha256:ccdbb80308cc5ef43b605ac28fac29c6a597f89f5a169bbedbb8dec29c987439 sha256:63c99163f47292f80f9d24c5b475751dbad6dc795596e935c5c7f1c73dc08107" | sha256sum | awk '{print $1}'一定注意要加上 “sha256:”和中间的空格“ ”这两个字符,否则计算就错误了。得出中间层chainID它也包括自己diff、parent、cache-id等:8d8dceacec7085abcab1f93ac1128765bc6cf0caac334c821e01546bd96eb741再计算最后的chainID:#echo -n "sha256:8d8dceacec7085abcab1f93ac1128765bc6cf0caac334c821e01546bd96eb741 sha256:2f140462f3bcf8cf3752461e27dfd4b3531f266fa10cda716166bd3a78a19103" | sha256sum | awk '{print $1}'得出最后的值为:3dd8c8d4fd5b59d543c8f75a67cdfaab30aef5a6d99aea3fe74d8cc69d4e7bf2

5. chainID->cacheID

最后从chainID->cacheID通过上一步计算找到当前最顶层的chainID:/var/lib/docker/image/overlay2/layerdb/sha256/保存了chianID信息,目录名称为chainID这个目录下的cache-id、diff、parent通过这个chain生成一个cache-iddiff保存当前layer的diff IDparent保存上一层layer的chainID# cd 3dd8c8d4fd5b59d543c8f75a67cdfaab30aef5a6d99aea3fe74d8cc69d4e7bf2# cat cache-idddd5760e7cbfde67e325e77b540dfc13e7dccf1c7d1b156554d0a79378642bd1

6. 从cache-id得到最终的磁盘文件:

从cache-id得到最终的磁盘文件:在/var/lib/docker/overlay2/# cd /var/lib/docker/overlamy2/<cache-id>得到当前的内容

7. 总结

Overlay2比overlay更加高效,因为overlay2优化了inode的利用。

layerID -> diffID -> chainID -> cacheID

layerID和diffID的对应关系在diffid-by-digest和v2metadata-by-diffid

chainID主要存在于/var/lib/docker/image/overlay2/layerdb/sha256/,

cacheID主要存在于/var/lib/docker/overlay2/

docker中镜像各ID之间的关系和计算-layerID-diffID-chainID-cacheID的计算相关推荐

  1. docker中各ID之间的关系和计算(二)-layerID-diffID-chainID-cacheID的计算

    第一步: 首先我们先拉取镜像: # docker pull ubuntu:latest Using default tag: latest latest: Pulling from library/u ...

  2. docker中容器与容器之间通讯

    概述 Docker 中存在多个容器时,容器与容器之间经常需要进行通讯,例如nacos访问mysql,redis集群中各个节点之间的通讯. 解决方案 Docker 中容器与容器之间进行通讯的解决方案一般 ...

  3. Python中怎样改变集合之间的关系?

    Python中怎样改变集合之间的关系?数学中,两个集合关系的常见操作包括:交集.并集.差集.补集.设A,B是两个集合,集合关系的操作介绍如下: 交集是指属于集合A且属于集合B的元素所组成的集合, 并集 ...

  4. 一文理清Mybatis中resultType与resultMap之间的关系和使用场景

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 1.概述 Mybatis ORM半自动映射框架对java开发工程师来说应该是必会的框架之一. ...

  5. OpenVX中 graph与node之间的关系,以及在CNN中的定位

    OpenVX中 graph与node之间的关系,以及在CNN中的定位 很多小伙伴都知道,OpenVX是用来处理图像的一组API,核心是kernel函数的实现,OpenVX对于图像处理是调用底层硬件的G ...

  6. (1)三相电机中相电压与线电压之间的关系 (2)电机转速,机器速度,电角速度之间的关系(3)磁链估算和磁场定向的定义

    三相电机中相电压与线电压之间的关系 Ua=1/3(2Uab+Ubc) Ub=1/3(Ubc-Uab) Uc=-1/3(Uab+2Ubc) 电机转速,机械速度,电角速度之间的关系 电角速度=机器速度* ...

  7. java中文件名和类名之间的关系

    在java里,文件名与类名之间的关系,有下面这些约束: Java保存的文件名必须与类名一致 如果文件中只有一个类,文件名必须与类名一致 一个Java文件中只能有一个public类 果文件中不止一个类, ...

  8. android中matrix的单位,Android中canvas和matrix之间的关系是什么?

    我读了这个画布概述: The Canvas class holds the "draw" calls. To draw something, you need 4 basic co ...

  9. 【Android 界面效果10】Android中View,ViewGroup,Window之间的关系

    一.首先说说View和ViewGroup吧 Android系统中的所有UI类都是建立在View和ViewGroup这两个类的基础上的.所有View的子类成为"Widget",所有V ...

最新文章

  1. ubuntu系统debootstrap的使用
  2. IOS中获取各个文件的目录路径的方法和NSFileManager类
  3. torchvision 笔记:transforms.Compose()
  4. windows7下cmd中一键切换virtualenv中的Python版本
  5. AE 新建项目(一)(持续更新,做到哪算哪)
  6. 嵌套字典|python_Python | 如果不是,则使用嵌套,根据销售额计算折扣
  7. ipad导入pdf_Ipad笔记法①日常笔记篇
  8. 【转】ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了
  9. .NET 框架中的字符串(转自MSDN,关于字符串的详细解说!)
  10. JSP — request 内置对象
  11. 互联网+创新创业大赛项目计划书,个人原创你学会了吗?
  12. 运算放大器分析----虚短和虚断简单计算
  13. 第三方对接秀米图文编辑器遇到的坑
  14. QQ连连看外挂核心算法(检测点对点)
  15. el-descriptions文本水平垂直居中
  16. 8. 查询表orders——统计各类商品的销售量
  17. 权重衰减 weight_decay 是个啥
  18. TNS-12535,TNS-00505,ORA-3136报错信息处理
  19. Leetcode 剑指 Offer 58 - II. 左旋转字符串 LCOF - Python
  20. 事件监听机制(一)Java事件监听

热门文章

  1. 万向区块链“汽车供应链物流服务平台”获评“2018金融区块链创新应用优秀案例”...
  2. python处理问题汇总二(重复值索引,顺序读取文件,drop函数,数组元素排名)
  3. 教学方法(学科教学法)
  4. 将来有机会把自己的院子建成这种
  5. 一款仿网易云音乐的App
  6. 广告术语(持续更新...)
  7. HTML显示证件页面图形,证件信息.html
  8. c语言:求一个5×5方阵主对角线元素的和以及副对角线元素的积
  9. 文件实时同步备份软件那个比较好用?
  10. 一张图玩转 XMind 思维导图软件