Containerd是如何存放容器镜像和数据的--overlayfs

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Containerd是如何存放容器镜像和数据的--overlayfs相关的知识,希望对你有一定的参考价值。

overlayfs是内核支持的文件系统,具体可参考​overlayfs in kernel​文档中的解释。overlaylfs是文件系统之上的文件系统。可以称之为上层文件系统。了解虚拟化的同学应该了解underly网络和overlay网络。所谓overlay网络也就是在物理网络基础上虚一个网络平面出来。Overlayfs 既然是上层文件系统,他就不需要直接和磁盘等存储系统进行交互,他就直接和其他文件系统交互就行了。

Mount -t overlay overlay -o lowerdir=/low1,low2,low3,upperdir=/upper,workdir=/work  merged_dir

命令把多个目录整合成一个目录。用户添加和更新、删除的文本都存放在upper目录中。而lowder是只读的。work 目录为工作基础目录,挂载后内容会被清空,且在使用过程中其内容用户不可见。merged_dir则是把upper目录和lowerer目录合并,这个合并规则就是overlayfs要实现的逻辑。新增文件写入uppder目录。Workerdir删除文件需要记录一个标记.Low1 、low2 、low3、upper优先级逐步提高,如果存在同名同目录文件,以优先级高的为本。修改low目录中文件,则需要拷贝一份low目录文件到upper层。然后修改。此处会导致第一次拷贝慢。

Containerd是如何存放容器镜像和数据的--overlayfs_upper

lower层:拉镜像解压而成,只读

upper层:创建容器时生成,可写层

containerd中的overlayfs 原理

1)在containerd中,用户pull拉镜像时,会返回多个层(layer),这些层都是压缩文件。containerd会把这些压缩文件解压然后存到/var/lib/containerd/io.containerd.snapshooter.v1.overlay中(lowder)io.containerd.snapshotter.v1.overlayfs中对应的是layer解压后的文件夹。我们看到这些文件夹以1、2、3等命名。镜像对应的层文件夹都是只读的。

2)容器启动时,在/var/lib/containerd/io.containerd.snapshooter.v1.overlay创建一个读写目录,也就是所谓的upper层。

Containerd的配置文件中有如下两个配置:

cat /etc/containerd/config.toml

root = "/var/lib/containerd"

state = "/run/containerd"

root配置的目录是用来保存持久化数据的目录,包括​content​​snapshot​​metadata​​runtime​​。

state配置的目录是用来保存运行时数据。

pull镜像时,镜像对应的config、index、layer、manifest都存储在/var/lib/containerd/io.containerd.content.v1.content/blob/sha256中。index和manifest可以直接用cat命令查看,layer文件可以用tar解压缩。因此content中保存的是config, manifest, tar文件是OCI镜像标准的那套东西。(镜像存放在/var/lib/containerd/io.containerd.content.v1.content/blob/sha256中)

启动镜像后,会在目录/run/containerd/io.containerd.runtime.v2.task/k8s.io/和/var/run/containerd/io.containerd.runtime.v2.task/k8s.io下面生成一个$CONTAINER ID的文件夹,这个目录就是overlayfs 中merge目录。

控制台(标准输出)日志目录:/var/log/pods/$podname

验证overlayfs文件系统挂载

mount |grep overlayfs

以上是关于Containerd是如何存放容器镜像和数据的--overlayfs的主要内容,如果未能解决你的问题,请参考以下文章

containerd和docker技术的比较

containerd容器环境搭建教程

Containerd 如何配置 Proxy?

dockerimage可以直接给containerd使用?

如何在golang代码里面解析容器镜像

containerd — 容器引擎