先挖坑,再填土


先上结论:Image = config.json(配置) + rootfs(文件系统).

接下来让我们一起拆箱一个 Image 。

先从 Dockerhub 上拉一个 alpine 下来,alpine 自夸小中王者,我们选中的这个镜像仅 5.59M。

docker pull alpine:3.15.0
# 捉出来看看
docker save -o alpine.tar alpine:3.15.0

存到本地后,解开看看里面都有啥,tree 一下可以发现里面有两层目录,共5个文件。

第一层目录

这层目录有3个条目:2个 json + 1个以 sha 值命名的目录 <25fe…>

① manifest.json

打开清单文件 ,里面列出了这个镜像的所有内容,非常简单,包括:Config(指示配置文件)、RepoTags(在镜像仓库里的 tag)、Layers(所有镜像层文件)。

Config 指向了同一层级的另一个 json 文件 <c059…>.json。

Layers 列出了所有的镜像层文件,第一个为第一层镜像层,这里指向了 <25fe…> 目录下的 layer.tar 文件,因为我们下的这个镜像比较简单,只有一层,所以这里只有一条 layer 记录。如果有多条 layer 记录,就会依次追加在后面,每条 layer 记录中的 sha 值都会有一个对应的目录。

② <c059…>.json

这个 json 文件的文件名是它自己的 sha 值,也是我们看到的 Image ID,文件的内容就是镜像的配置。

这里保存了镜像的配置,一目了然的字段就不说了。container_config、container 这两项记录了最后 commit 到镜像的容器的信息。我们知道,镜像是多层只读的文件层,而容器指最上层的可写文件层,将容器 commit 到镜像,就是把可写层提交为最新的一层只读层。

config 列出从镜像启动为容器时的默认配置参数,Env、CMD、Entrypoint 这些。

rootfs 主要放各层文件的标识——diff_ids,本处的 diff_id 是对 <25fe…>/ 下的 layer.tar 做 sha 得到的。

③ 25fe…/

这是我们的镜像文件层,目录名称为 layer-chain-id,在 OCI 规范中 layer-chain-id 生成规则如下图所示。实际上在本地看到的 layer-chain-id 和 manifest.json 里 layers 记录的值并不相同,可能计算的是 registry 里存储的压缩文件的 sha,而非本地拉下来这个——这个镜像有点不讲究。拉个 nginx 镜像可以看到 diff-id、layer-chain-id 是遵循 OCI 的 Image Format 规范的。

打开看看第二层目录都有啥。

第二层目录

接下来进入 <25fe…> 目录中,有三个文件:json、VERSION、layer.tar。

④ json

这是本层镜像的配置文件,和我们在第一级目录看到的 <c059…>.json 差不多,都是配置参数。

⑤ layer.tar

解开 layer.tar 可以发现这就是我们挂在嘴边的(应用运行所依赖的)操作系统环境。如果有不止一层,则除了第一层的后续层一般就放增量的文件,对于同样的文件,n+1 层会覆盖前面 n 层中出现的同名文件。

⑥ VERSION

保存了一个版本号。

最后

再回到 manifest.json,1个 Config + 1个 layer.tar ≈ alpine image。

以上就是一个典型的镜像。


更多:

分类: CODE

3 条评论

опрессовка · 2023年1月22日 上午6:56

Excellent website you have here but I was curious about if you knew of any message boards that cover the same topics talked about in this article?
I’d really love to be a part of group where I can get opinions from other experienced individuals that share the same interest.
If you have any suggestions, please let me know. Cheers!

    顽石 · 2023年1月23日 下午3:40

    If you are interested in k8s, I recommend to learn how to use it from its official website and corresponding github repository. You can also get more information from its community. Books like 《Kubernetes in action》 and 《Core kubernetes》 are also userful.

опре · 2023年2月13日 下午11:40

What’s up, this weekend is fastidious in support of me, for the reason that this time i am reading
this great educational piece of writing here
at my residence.

发表回复

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