docker中各ID之间的关系和计算(二)-layerID-diffID-chainID-cacheID的计算
第一步:
首先我们先拉取镜像:
# docker pull ubuntu:latest
Using default tag: latest
latest: Pulling from library/ubuntu
345e3491a907: Pull complete
57671312ef6f: Pull complete
5e9250ddb7d0: Pull complete
Digest: sha256:adf73ca014822ad8237623d388cedf4d5346aa72c270c5acc01431cc93e18e2d
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest
这里的345e3491a907,57671312ef6f,5e9250ddb7d0为压缩的layer层的哈希值这些值为layerID,即distribution hashes,他们从远程的repository拉取下来。
第二步:
查看镜像的详细信息:
# docker inspect ubuntu:latest
其中有一个rootfs的键值对,如下:
"RootFS": {
"Type": "layers",
"Layers": ["sha256:ccdbb80308cc5ef43b605ac28fac29c6a597f89f5a169bbedbb8dec29c987439", "sha256:63c99163f47292f80f9d24c5b475751dbad6dc795596e935c5c7f1c73dc08107", "sha256:2f140462f3bcf8cf3752461e27dfd4b3531f266fa10cda716166bd3a78a19103"
]
},
这是镜像的底层的rootfs,但是我们发现这些sha256值和第一步拉取下来的层layerID不一致。这是为什么呢?
因为pull下来的是压缩的数据,layerID是压缩数据的sha256的值(Layer ID指Distribution根据layer compressed data计算的),而inspect rootfs中的值是解压后,对解压的内容进行sha256的值他们是diffID,是在本地由Docker根据layer uncompressed data计算的。
记住这里的rootfs layers的值是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和库相关信息。
第四步:
从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
第五步:
最后从chainID->cacheID
通过上一步计算找到当前最顶层的chainID:
/var/lib/docker/image/overlay2/layerdb/sha256/保存了chianID信息,目录名称为chainID
这个目录下的cache-id、diff、parent
通过这个chain生成一个cache-id
diff保存当前layer的diff ID
parent保存上一层layer的chainID
# cd 3dd8c8d4fd5b59d543c8f75a67cdfaab30aef5a6d99aea3fe74d8cc69d4e7bf2
# cat cache-id
ddd5760e7cbfde67e325e77b540dfc13e7dccf1c7d1b156554d0a79378642bd1
第六步:
从cache-id得到最终的磁盘文件:
在/var/lib/docker/overlay2/
# cd /var/lib/docker/overlay2/<cache-id>
得到当前的内容。
完结。
总结:
Overlay2比overlay更加高效,因为overlay2优化了inode的利用。
layerID -> diffID -> chainID -> cacheID
layerID和diffID的对应关系在diffid-by-digest和v2metadata-by-diffid
chainID主要存在于/var/lib/docker/image/overlay2/layerdb/sha256/<chain-id>,
cacheID主要存在于/var/lib/docker/overlay2/<cache-id>
如果觉得本文很棒,请作者喝杯咖啡吧,加油哦!!!
docker中各ID之间的关系和计算(二)-layerID-diffID-chainID-cacheID的计算相关推荐
- docker中镜像各ID之间的关系和计算-layerID-diffID-chainID-cacheID的计算
1. 拉取镜像 首先我们先拉取镜像: # docker pull ubuntu:latest Using default tag: latestlatest: Pulling from library ...
- 轻松玩转hive中各种join之间的关系以及使用
hive编程是整个数据仓库操作的核心,而各种业务之间的join是hive的核心,所以熟练明白滴掌握hive中的各种join是数据仓库开发工程师必备的技能. hive中的join只支持等值join ...
- 镜像和linux关系,Docker中容器和镜像的关系【通俗易懂】
docker中容器和镜像的关系是什么? 最近学习了docker,大多人感觉容器和镜像学的有点模糊. 特别是镜像和容器,感觉完全分不开,所以在此学习,然后总结了一下,便于后面的学习. 这是我总结的镜像总 ...
- 商品期货中各种品种之间的关系研究
商品期货中各种品种之间的关系研究 作者:来源:时间:2018-12-01 14:01:14 在产品期货买卖中,许多种类之间会出现着不同程度的相关联系,有时分是由于同种原因导致的,比方说,社会全体需求增 ...
- 摄像机标定中四大坐标系之间的关系
一.四个坐标系简介和转换 相机模型为以后一切标定算法的关键,只有这边有相当透彻的理解,对以后的标定算法才能有更好的理解.本人研究了好长时间,几乎每天都重复看几遍,最终才会明白其推导过程. 我 ...
- Docker中安装Jenkins实时发布.net core 项目(二)
Docker中安装Jenkins实时发布.net core 项目 防坑点 升级docker jenkins运行 运行命令 jenkins拉取git并构建项目 其他 查看发布文件 防坑点 升级docke ...
- 【docker】关于docker 中 镜像、容器的关系理解
例如,使用docker 拉取下来一个要用的镜像es docker pull elasticsearch:5.6.9 此时es的镜像存在与服务器上 docker images 对于你运行镜像为一个容器的 ...
- javascript中的对象之间继承关系
相信每个学习过其他语言的同学再去学习JavaScript时就会感觉到诸多的不适应,这真是一个颠覆我们以前的编程思想的一门语言,先不要说它的各种数据类型以及表达式的不同了,最让我们头疼,恐怕就是面向对象 ...
- 网络中的计算机之间的关系,有关服务器与主机之间的关系
局域网,是指"存在于某一个较小地理区域内的计算机网络".通常把两台以上的电脑通过各种介质(比如双绞线.同轴电缆.电话线等等,空气也算是一种介质,这就是无线网络)连接起来,这就构成了 ...
最新文章
- 写了一个操作XML文件的类
- Python学习笔记(十三)
- c语言大数倍数,leetcode-1346(检查整数及其两倍数是否存在)--C语言实现
- mysql 表死锁_MySQL Innodb表导致死锁日志情况分析与归纳
- java视频教程下载
- 【Java编码规范】《阿里巴巴Java开发手册(正式版)》
- 一、Matlab图像处理入门
- 理解计算机故障排除的基本顺序,开关常见五种故障实例解读
- rtl8812bu网卡Linux驱动,Linux 安装 RTL8812AU 无线 USB 网卡驱动
- idea社区版创建springboot_IDEA社区版创建spring boot项目的安装插件的图文教程
- Lambda将搬砖变成艺术
- 深入理解地址翻译 CSAPP
- ADSP21489 Target halted due to software breakpoint but no breakpoint found at address: 0x208c0b6 ()
- 如何把EAN13码外观设置和code128码一样
- Excel插入图片(C#)
- 北京市高等教育自学考试2023年教材信息表
- 5-1 Coursera吴恩达《序列模型》 第一周课程笔记-循环序列网络(RNN)
- 小程序实现长按图片弹出保存图片、发送给朋友、识别图中码菜单。
- GitHub官方出手,一针见血!Spring Boot趣味实战手册来袭(彩版)
- 139邮件服务器怎么设置,移动139邮箱pop,imap,exchange设置参数
热门文章
- 华为硬件笔试 通用器件知识2_汽车智能化的起点-车规级元器件
- 后缀树 Suffix Tree
- 快速提高点击率的办法
- 提高网站提高网站广告点击率的几个可行方法
- 与 Hadoop 对比,如何看待 Spark 技术
- DC-DC BOOST空载输入电流如何计算?
- dropout层加在哪里_Nomaomi
- SOEM 源码解析 ecx_FPWRw
- Could not calculate build plan: Plugin org.apache.maven.plugins:maven-war-plugin:3.2.2
- 如何读到一个文件的最后更新日期和时间