首页 > 其他分享 >containerd容器存储探究

containerd容器存储探究

时间:2023-01-01 00:12:50浏览次数:72  
标签:容器 task context overlayfs containerd 探究 io var

ContainerD 容器目录结构探究

启动容器

作为开始,我们需要去启动一个容器。

你可以通过命令行的方式来启动一个容器,例如:

ctr i pull docker.io/library/nginx:alpine
ctr c create docker.io/library/nginx:alpine nginx
ctr task start -d nginx

或者一步到位:

ctr run -d docker.io/library/nginx:alpine nginx

也可以通过编程的方式来启动

import (
  "context"

  "github.com/containerd/containerd"
  "github.com/containerd/containerd/cio"
  "github.com/containerd/containerd/namespaces"
)


func main() {
	client, err := containerd.New("/run/containerd/containerd.sock")
	defer client.Close()
    
    context = context.Background()
    // create a context for docker
    redis, err := client.NewContainer(context, "redis-master")
    defer redis.Delete(context)
    // create a new task
    task, err := redis.NewTask(context, cio.NewCreator(cio.WithStdio))
    defer task.Delete(context)

    // the task is now running and has a pid that can be used to setup networking
    // or other runtime settings outside of containerd
    pid := task.Pid()

    // start the redis-server process inside the container
    err := task.Start(context)

    // wait for the task to exit and get the exit status
    status, err := task.Wait(context)
}

相关概念

在 containerd 中,container 这个概念特指一个元数据对象。诸如OCI运行时规范、镜像、根文件系统和其他元数据等资源可以附加到一个 container上。例如:

redis, err := client.NewContainer(context, "redis-master",
	containerd.WithNewSnapshot("redis-rootfs", image),
	containerd.WithNewSpec(oci.WithImageConfig(image)),
)

要启动像 docker 那样的容器,在 containerd 中称为 task ,一个 task 就是对进程(容器就是一个进程)的封装。所以在上述代码中,我们都是对一个 task 来进行这么一个 创建/进入/暂停/删除 等操作。

在第二个参考资料中有人探讨了为何这么设计。

容器存储

containerd 有两个不同的存储路径,一个用来持久化,一个用来保存运行时状态。

root = "/var/lib/containerd"
state = "/run/containerd"

我们知道docker使用的是overlayfs2,那containerd呢?官网有这么一句话:

\(\text{containerd allows you to use overlay or snapshot filesystems with your containers. It comes with built-in support for overlayfs and btrfs.}\)

containerd 内置支持 overlayfs 和 btrfs ,overlayfs我们再熟悉不过了, btrfs 可能不太熟悉,不用慌,下面稍微介绍一下 btrfs。

我们现在安装linux系统时有时会让你选择文件系统例如 ext2/ext3/ext4 等,而 btrfs 被 ext4 的作者称赞且认为其是下一代linux标准文件系统。但是目前 btrfs 还是在开发中,生产环境中 btrfs 还是很少。

对于 overlayfs ,我们知道docker的容器分为 LowerDir 和 UpperDir ,LowerDir 为镜像层文件,UpperDir 为容器目录,合起来就是 MergeDir ,就是最终看到的容器目录。那 containerd 的 LowerDir 和 UpperDir 分别在哪呢?

root@aliyun:~# mount | grep /var/lib/containerd
overlay on /run/containerd/io.containerd.runtime.v2.task/default/nginx/rootfs type overlay (rw,relatime,lowerdir=/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/7/fs:/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/6/fs:/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/5/fs:/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/4/fs:/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/3/fs:/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/2/fs:/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/1/fs,upperdir=/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/8/fs,workdir=/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/8/work,xino=off)

使用 mount 命令,他直接就给你显示了

参考资料

  1. https://icloudnative.io/posts/getting-started-with-containerd
  2. https://github.com/containerd/containerd/discussions/4458
  3. [https://github.com/containerd/containerd
  4. https://blog.frognew.com/2021/06/relearning-container-09.html

标签:容器,task,context,overlayfs,containerd,探究,io,var
From: https://www.cnblogs.com/xdaniel/p/17017628.html

相关文章

  • Centos7上使用jenkins执行pipeline在容器内部拉取环境运行代码的各种坑
    环境Centos7上部署了三个服务bitbucket192.168.1.156:7900jenkins192.168.1.156:8080docker服务原理在Dockerfile中定义pipelinescripts,然后拉取dockerhub的镜像作......
  • Docker bridge网络 固定容器ip
    1.创建子网网络和查看网络dockernetworkcreate--driverbridge--subnet=172.18.18.0/16--gateway=172.18.1.1mybridge查看网络dockernetworkls查看网络......
  • 深入探究ASP.NET Core读取Request.Body的正确方式
    前言常用读取方式同步读取异步读取重复读取源码探究前言相信大家在使用ASP.NETCore进行开发的时候,肯定会涉及到读取Request.Body的场景,毕竟我们大部分的POST请求......
  • Docker 容器连接
    Docker容器连接前面我们实现了通过网络端口来访问运行在docker容器内的服务。容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过-P或-p参数来指定端口映射。......
  • Docker 容器连接
    容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P 或 -p 参数来指定端口映射。下面我们来实现通过端口连接到一个docker容器。 网络端口映射......
  • .net core (.net 6) IOC容器注入 -- autofac
    注:接口代码、类库代码参考:.netcore(.net6)IOC容器注入--内置容器 Autofac容器优点:灵活(属性注入、多种生命周期、AOP扩展)、比较流行(技术门槛低)1、引入NuGet包Auto......
  • .net core (.net 6) IOC容器注入--内置容器
    1、添加类库项目 Demo02.Interface、Demo02.Service 2、创建ITestServiceA接口namespaceDemo02.Interface{publicinterfaceITestServiceA{p......
  • STL容器综合(string除外)
    ①vector容器:类似于数组,但是他是单端数组与数组的区别:数组是静态空间,vector是动态可扩展的动态扩展:找一个更大的新内存空间,把原空间的的数据拷贝一份放到新空间,然后释放......
  • Docker容器内服务自启动解决方案
    背景在很多场景下,我们需要拉取或者是使用的别人的容器,但是有些容器内部的服务并不能自启动,比如Apache服务、mysql服务等等,对于数量较少的容器来讲,我们可以进入容器中使用......
  • 华为云OBS:让大数据的容器再无容量限制​
    华为云OBS:让大数据的容器再无容量限制​如果把大数据比作各色佳肴,那么存储系统就是盛放这些珍馐的容器,信息时代的企业数据内容多样,且数量庞杂,把容纳数据的“碗”做好,同样是......