好好活就是有意义的事,有意义的事就是好好活
Docker中各种ID的含义
Docker中各种ID的含义

Docker中各种ID的含义

初接触docker学习其存储管理的时候,我们会遇到各种各样的ID,比如chainID、imageID等等,那么这么多的ID都代表什么含义,又是如何计算的呢?我们以目前比较新的docker版本来研究总结一下吧:

首先我使用的平台是:

preview

其次我的目前的系统上只有一个镜像文件ubutnu,并且创建了一个名为ubuntu的镜像此时我们打开/var/lib/docker/image/overlay2(没错,最新的docker默认使用的是overlay2驱动哦),查看该目录下的文件:

我们看到了三个文件夹和一个文件,其中后三个分别存放image、layer和repositories元数据,我们查看repositories.json的内容:

preview

里面存放的是每个repository的名字(ubuntu)以及每个repository下所有版本镜像的名字一起tag(ubuntu:latesta)和该镜像的ImageID(cd6d8154f1e…)

ImageID:唯一标志一个镜像,其数值根据该镜像的元数据配置文件采用sha256算法的计算获得。

那么镜像的元数据配置文件在那呢?就在imagedb文件中:

位置:/var/lib/docker/image/overlay2/imagedb/content/sha256/

该文件部分内容:

我们可以对这个文件进行一次sha256的校验:

preview

sha256sum [filename] —->输出结果为前面是校验值,后面是文件名。

我们知道docker中的镜像是分层的,并被划分了只读层和读写层。其中docker定义了roLayer接口来描述只读的镜像层,定义了mountLayer来描述可读写的容器层。这两个层分别存放在了两个目录中:

roLayer:/var/lib/docker/image/overlay2/layerdb/sha256

mountLayer:/var/lib/docker/image/overlay2/layerdb/mount

我们先来分析镜像层:

preview

我们可以看到一共有五个目录,每个目录代表一个镜像层,目录的名字为镜像的chainID,打开开镜像层文件查看其内容:

preview

包含四个文件,文件内容分别是分别:镜像层的cacheID、diffID、父镜像层的chainID、镜像层的大小(注意,这里存放的都是镜像层元数据)

cacheID:由宿主机随即生成的一个uuid,根镜像层文件一一对应,用于宿主机标志和索引镜像层文件

diffID:镜像层校验ID、根据该镜像层的打包文件校验获得

parent:父镜像层的chainID(最底层不含该文件)

chainID:docker内容寻址机制采用的索引ID,其值根据当前层和所有祖先层的diffID算得:

  • 若该镜像层是最底层,那么其chainID 和 diffID 相同
  • 否则,chainID=sha256(父层chainID+” “+本层diffID)

好啦,我们在来看mountLayer中的内容:

只有一个文件,也就是说明只有一个容器层,因为前面说了我只创建可一个容器,该目录的名字即containerID,查看该文件的内容:

三个文件分别表示了容器init层的initID、容器读写层的mountID以及容器层的父镜像层的chainID

containerID:我们知道是宿主机在创建容器时随即分配的

initID、chainID:类似于镜像层的cacheID(我猜测的,婴婴婴)

parent:准确的说应该是init层的父镜像层的chainID,因为读写层的父层就是init层,我们可以查看/var/lib/docker/overlay2验证这个涉及到overlay2驱动的内容验证.

一条评论

  1. Pingback:Docker中净镜像层的diffID如何计算? – Kingdo Station

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注