containerd在架构上被设计为主要是协调bundles的创建和执行。bundles是指被Runtime使用的配置、元数据、rootfs数据。一个bundle就是一个运行时的容器在磁盘上的表现形式,简化为文件系统中的一个目录。
    下图是containerd创建bundle的数据流图:
    containerd创建bundle的数据流 - 图1

    1. 指示Distribution Controller去拉取一个具体的镜像,Distribution将镜像分层内容存储到内容存储中(content store),将镜像名和root manifest pointers注册到元数据存储中(metadata store)。
    2. 一旦镜像拉取完成,用户可以指示Bundle Controller将镜像分解包到一个bundle中。从内容存储中消费后,图像中的层被解压缩到快照组件中。
    3. 当容器的rootfs的快照准备好时,Bundle Controller控制器可以使用image manifest和配置来准备执行配置。其中一部分是将挂载从snapshot模块输入到执行配置中。
    4. 然后将准备好的bundle给Runtime子系统以执行, Runtime子系统将读取bundle配置来创建一个运行的容器。

    以上对应containerd的数据根目录下的各个子目录:

    1. ll /var/lib/containerd/
    2. io.containerd.content.v1.content
    3. io.containerd.grpc.v1.introspection
    4. io.containerd.metadata.v1.bolt
    5. io.containerd.runtime.v1.linux
    6. io.containerd.runtime.v2.task
    7. io.containerd.snapshotter.v1.btrfs
    8. io.containerd.snapshotter.v1.native
    9. io.containerd.snapshotter.v1.overlayfs
    10. tmpmounts

    content中保存是OCI标准tar和mainfest配置文件的,即保存的是镜像,解压后,可以mount给容器使用。 snapshotter的主要作用是通过mount各个层,为容器准备rootfs。