好好活就是有意义的事,有意义的事就是好好活
Docker中镜像层的diffID如何计算?
Docker中镜像层的diffID如何计算?

Docker中镜像层的diffID如何计算?

Docker中镜像层的diffID如何计算?

关于什么是diffID, 以及docker的各种ID解释, 欢迎移步:

但是对于如何计算diffID, 上文描述非常的简单。

docker中各ID之间的关系和计算(二)-layerID-diffID 中对于我没提到的layerID进行了补充。

diffID的计算方法根据镜像层的sha256校验值获取的,这里的镜像层是指打包状态下的tar文件的校验值。

但是我们在docker pull的时候,会下载压缩的镜像层,此时会进行一次校验, 得到的是layerID, 然后解压得到tar归档文件, 这个时候校验得到diffID, 然后再展开tar,变成目录,因此本机上是不存在镜像层的tar文件的。

我尝试从镜像层的目录中重新归档成tar进行校验, 但是都没成功, 所以,这里用另一种方式进行测试diffID的计算过程:

下载一个指定版本的nginx镜像,然后查看其镜像层的信息
# docker pull nginx:1.18.0
# docker image inspect nginx:1.18.0
[
    {
        "Id": "sha256:c2c45d506085d300b72a6d4b10e3dce104228080a2cf095fc38333afe237e2be",
        "RepoTags": [
            "nginx:1.18.0"
        ],
        ....
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:7e718b9c0c8c2e6420fe9c4d1d551088e314fe923dce4b2caf75891d82fb227d",
                "sha256:f3fdf88f1cb7d08fbed8cab90e6532c541ae42bef3dfb632b90916b1caf5c794",
                "sha256:6fcbf7acaafd42c4f5758dbdff3da64c437f602b993ff0b0ab0f335b026ab8f8",
                "sha256:4fe7d87c8e14cf324d451df3e2c4e63e4434b8d13c2c17e82d001089a257e466",
                "sha256:4fa6704c84745b37a8090fd1f0c971c31c4ab7b9936c5ff2693872a1b5fedc9a"
            ]
        },

可以观察到, 一共有5个镜像层, 这里使用的就是diffID, 其中7e718…是最底层的镜像, 因此其diffID和chainID是相等。所以我们可以在其元数据目录中查看:

# cd /var/lib/docker/image/overlay2/layerdb/sha256/7e718b9c0c8c2e6420fe9c4d1d551088e314fe923dce4b2caf75891d82fb227d
# ls
cache-id  diff  size  tar-split.json.gz
# cat diff
sha256:7e718b9c0c8c2e6420fe9c4d1d551088e314fe923dce4b2caf75891d82fb227d...
通过docker save指令,获取打包的docker镜像
$ docker save nginx:1.18.0 > nginx.tar

将其解压之后, 我们将得到各个镜像层:

# tar -xvf nginx.tar
# ll
drwxr-xr-x  2 root root      4096 Apr 10  2021 5d5f02301e415b56daa8fefa81cfe70436fafb56596f9a397fe5cddcde8cc532/
drwxr-xr-x  2 root root      4096 Apr 10  2021 88a5033f64e4b323c387d762ec17331f9ce8f501b4ad690dbd0776bd36ab04c8/
drwxr-xr-x  2 root root      4096 Apr 10  2021 9c82797503afe4dc07b847655922e0b552a7f0597bda76bd080686b3d9d7cd68/
drwxr-xr-x  2 root root      4096 Apr 10  2021 a970f57a9bee9a886530115b264971d48eb2454f96b0b56c0e23c32f33eb1b6a/
drwxr-xr-x  2 root root      4096 Apr 10  2021 b58bbc78c87cd0df62cc0cec0df6d9623236f7c8af04af142aa5dfad615f1a4e/
-rw-r--r--  1 root root      7462 Apr 10  2021 c2c45d506085d300b72a6d4b10e3dce104228080a2cf095fc38333afe237e2be.json
-rw-r--r--  1 root root       509 Jan  1  1970 manifest.json
-rw-r--r--  1 root root 137160192 Feb 17 15:45 nginx.tar

得到了5个目录, 分别对应nginx的5个镜像层,目录的名字应该是随机生成的, 我们挨个点开, 查看其json文件,根据有没有parent字段可以确定谁是最底层的镜像层, 在这里是:88a50

然后我们打开这个目录,对其中的tar文件进行校验:

#  cd 88a5033f64e4b323c387d762ec17331f9ce8f501b4ad690dbd0776bd36ab04c8/
#  ls
json  layer.tar  VERSION
# sha256sum layer.tar
7e718b9c0c8c2e6420fe9c4d1d551088e314fe923dce4b2caf75891d82fb227d  layer.tar

得到的结果就是diffID, 是不是和我们在第一步中得到的一样?

发表回复

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