
文|李楠(GitHub ID : @loheagn)
北京航空航天大学 21 级研究生
云原生底层系统的开发和探索工作。
本文 6369 字 阅读 16 分钟

OSPP 开源之夏是由中科院软件研究所“开源软件供应链点亮计划”发起并长期支持的一项暑期开源活动。旨在鼓励在校学生积极参与开源软件的开发维护、促进优秀开源软件社区的蓬勃发展、培养和发掘更多优秀的开发者。
这是去年(2022)的开源活动中,李楠同学参加 Nydus 容器开源生态集成课题的相关工作。
| 作者有话说 |
大家好!我是来自北京航空航天大学的 2021 级研究生李楠,对云原生技术很感兴趣,GitHub ID 是 @loheagn。在今年上半年,我参加了 Linux 基金会的春季实习,完成了 CNCF - Kubevela: Management of Terraform state 项目的工作,并因此培养了对开源工作的兴趣。在开源之夏 2022 开放题目后,我了解到了 Nydus 项目,感觉这是一个很酷的项目,由于我之前对容器和镜像的底层技术并不是很熟悉,觉得这是个很不错的学习机会。于是便尝试投递了简历申请,最终很幸运地通过了筛选,并在严松老师的帮助下顺利完成了题目。
PART. 1 项目背景
Nerdctl
Nerdctl 是一个对标 Docker CLI 和 Docker Compose 的、用于与 Containerd (当下最流行的容器运行时,Docker 的后端也是调用的 Containerd,通常作为守护进程出现) 交互的命令行工具。
用户可以像使用 Docker CLI 一样使用 Nerdctl 与 Containerd 进行交互,比如使用 nerdctl pull <image_name> 来拉取镜像、使用 nerdctl run <image_name> 来运行容器等等。
相比于 Containerd 本身提供的 CTR 工具,Nerdctl 默认提供了更友好的用户体验,并尽量保持其使用方式与 Docker 一致。对于从 Docker 迁移到 Containerd 的用户,往往只需要 alias docker=nerdctl 就可以与之前获得一致的使用体验。
OCI 镜像格式
OCI 镜像格式是 OCI (Open Container Initiative,开放容器计划) 的重要组成部分。它给出了一个厂商无关的镜像格式规范,即一个镜像应该包含哪些部分、每个部分的数据结构是如何的、这些各个部分应该以怎样的方式进行组织等等。
OCI 镜像格式脱胎于 Docker 镜像格式,它与 Docker 镜像格式有着非常类似的结构;但它比 Docker 镜像格式有更好的兼容性,并得到了各个厂商的普遍认同。
因此,在这里主要介绍一下 OCI 镜像格式的主要内容。
通常所说的镜像文件其实指的是一个包含了多个文件的“包”,“包”中的这些文件提供了启动一个容器所需要的所有需要信息,其中包括但不限于,容器所使用的文件系统等数据文件,镜像所适用的平台、数据完整性校验信息等配置文件。当我们使用 docker pull 或 nerdctl pull 从镜像中心拉取镜像时,其实就是在依次拉取该镜像所包含的这些文件。
例如,当我们使用 nerdctl pull 拉取一个 OCI 镜像时:

从 Log 中可以清晰地看到,Nerdctl 依次拉取了一个 index 文件、一个 manifest 文件、一个 config 文件和若干个 layer 数据文件。实际上,一个标准的 OCI 镜像通常就是由这几部分构成的。
其中,layer 文件一般是 tar 包或者压缩后的 tar 包,其包含着镜像具体的数据文件。这些 layer 文件会共同组成一个完整的文件系统(也就是从该镜像启动容器后,进入容器中看到的文件系统) 。
config 文件是一个 JSON 文件。其中包含镜像的一些配置信息,比如镜像时间、修改记录、环境变量、镜像的启动命令等等。
manifest 文件也是一个 JSON 文件。它可以看作是镜像文件的清单,即说明了该镜像包含了哪些 layer 文件和哪个 config 文件。
下面是一个 manifest 文件的典型例子:
{
"schemaVersion": 2,
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"config": {
"mediaType": "application/vnd.oci.image.config.v1+json",
"digest": "sha256:0584b370e957bf9d09e10f424859a02ab0fda255103f75b3f8c7d410a4e96ed5",
"size": 7636
},
"layers": [
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"digest": "sha256:214ca5fb90323fe769c63a12af092f2572bf1c6b300263e09883909fc865d260",
"size": 31379476
},
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"digest": "sha256:50836501

本文介绍了Nerdctl如何支持Nydus镜像,包括Nydus镜像格式的优化和Nerdctl的改进,使得用户能够更好地利用Nydus的按需加载能力,提高容器启动效率。作者通过参与开源之夏项目,为Nerdctl添加了对Nydus镜像的拉取和转换功能,为云原生领域做出了贡献。
最低0.47元/天 解锁文章
516

被折叠的 条评论
为什么被折叠?



