4. Docker Daemon的Image Store

在Docker的存储目录中有一个叫做imagedb的目录,记录image相关的数据信息,那么是Who来维护这个文件夹,Image Store。

在开始学习这个模块之前,我们想想可能的功能:

1)根据IMAGE ID 查询镜像元数据信息
2)保存IMAGE ID 与元数据信息关联关系
3)没了。。。。。。

下面看函数名字就已经非常明白函数功能了, 对于数据库增删改查大家最熟悉不过了。Heads可能有点陌生,该函数在查询悬空镜像中使用,悬空镜像叫dangling,关于dangling的判定,可能直接阅读代码更加直观。

Create(config []byte) (ID, error)
Get(id ID) (*Image, error)
Delete(id ID) ([]layer.Metadata, error)
Search(partialID string) (ID, error)
SetParent(id ID, parent ID) error
GetParent(id ID) (ID, error)
SetLastUpdated(id ID) error
GetLastUpdated(id ID) (time.Time, error)
Children(id ID) []ID
Map() map[ID]*Image
Heads() map[ID]*Image
Len() int

1.在分析上面函数之前,我们来思考dockerd刚启动时,会加载imagedb中的数据,在内存中构建出IMAGE ID 与元数据的映射关系,方便Daemon快速查询元数据信息,所以刚启动初始化时,会从imagedb文件中加载镜像元数据。
1)读取/var/lib/docker/image/overlay2/imagedb/content/sha256所有镜像元数据信息,同时读取/var/lib/docker/image/overlay2/imagedb/metadata/sha256的parent IMAGE ID。
2)读取的镜像元数据包含DiffIDs的全部信息,计算出chainID信息,获取该image的layer管理句柄,根据parent 的IMAGE ID,支持以IMAGE_ID为索引查询镜像Layer模块句柄以及children信息,数据结构为Map,我们称之为store.images。这里并没有将image的其他信息保存在内存,每次获取需要读取磁盘。

2.Create(config []byte) (ID, error)
1)config内容保存至imagedb/content,并对config文件计算sha256,得到IMAGE ID
2)获取镜像Layer模块句柄,添加到store.images

3.Heads() map[ID]*Image
找到所有未被其他image引用的镜像,注意这里并不是获取dangling镜像,但所有的dangling镜像一定是未被其他image引用的镜像。
逻辑很简单,store.images.children为空表示,该镜像未被其他镜像引用。

至此,和image有关的基础组件内容介绍七七八八,下节开始介绍docker images相关的命令实现,如果你已经对前几节的内容有深刻理解,images命令原理您不看代码,也可以猜出实现方式。

猜你喜欢

转载自blog.csdn.net/xjmtxwd24/article/details/124866612