containerd容器存储探究
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 命令,他直接就给你显示了
参考资料
- https://icloudnative.io/posts/getting-started-with-containerd
- https://github.com/containerd/containerd/discussions/4458
- [https://github.com/containerd/containerd
- https://blog.frognew.com/2021/06/relearning-container-09.html
containerd容器存储探究的更多相关文章
- Kubernetes将弃用Docker!与 containerd容器引擎
时间戳:2022-06-07 20:32:19 星期二 撰写文档参考:(阿良-腾讯课堂)Kubernetes将弃用Docker 参考博客k8s入坑之路(3)containerd容器 container ...
- SQLServer2012 (非)聚集索引存储探究
SQLServer2012 (非)聚集索引存储探究 Author:zfive5(zidong) Email:zfive5@163.com 引子 因为写了前一篇文字<SQLServer2012 表 ...
- log4j容器初始化探究
Log4j容器初始化探究 Log4j第一步就是初始化Logger容器Repository,这一章我们来探究Logger容器,从别从独立应用以及servlet容器下启动初始化两方面探究. 1 独立应用 ...
- kubernetes/k8s CSI分析-容器存储接口分析
更多 k8s CSI 的分析,可以查看这篇博客kubernetes ceph-csi分析,以 ceph-csi 为例,做了详细的源码分析. 概述 kubernetes的设计初衷是支持可插拔架构,从而利 ...
- docker容器存储
写在前面 我们在上篇学习了容器网络,对容器网络驱动bridge工作原理做了较为详细的介绍,今天小作文一起看看容器中另一个关键域-存储. 容器的存储可以分为两大类: 一种是与镜像相关的即我们在<d ...
- Longhorn 企业级云原生分布式容器存储-券(Volume)和节点(Node)
内容来源于官方 Longhorn 1.1.2 英文技术手册. 系列 Longhorn 是什么? Longhorn 云原生分布式块存储解决方案设计架构和概念 Longhorn 企业级云原生容器存储解决方 ...
- 使用kubeoperator安装的k8s集群以及采用的containerd容器运行时,关于采用的是cgroup 驱动还是systemd 驱动的说明
使用kubeoperator安装的k8s集群,默认使用的是systemd驱动 # kubectl get cm -n kube-system NAME DATA AGE calico-config 4 ...
- Longhorn 企业级云原生容器存储解决方案-部署篇
内容来源于官方 Longhorn 1.1.2 英文技术手册. 系列 Longhorn 是什么? Longhorn 云原生分布式块存储解决方案设计架构和概念 安装 Longhorn 可以通过多种方式安装 ...
- docker镜像与容器存储结构分析
注意:转载请注明出处:http://www.programfish.com/blog/?p=9 Docker是一个开源的应用容器引擎,主要利用linux内核namespace实现沙盒隔离,用cgrou ...
- STL容器存储的内容动态分配情况下的内存管理
主要分两种情况:存储的内容是指针:存储的内容是实际对象. 看以下两段代码, typedef pair<VirObjTYPE, std::list<CheckID>*> VirO ...
随机推荐
- Selenium Webdriver驱动自管理
Webdriver驱动自管理 背景 在selenium自动化中,驱动和浏览器有一定的对应关系,以最常见的chrome和firefox为例. chrome 要求比较严格. 比如在地址栏输入chrome: ...
- Debian11换源
vi /etc/apt/sources.list deb http://mirrors.ustc.edu.cn/debian/ bullseye main non-free contrib deb-s ...
- Vue 24 props
1 简介 props主要用于组件的传值,他的工作就是为了接收外面传过来的数据,与data.el.ref是一个级别的配置项 2 一个简单示例 1)StudentComp.vue <template ...
- Typescript 回调函数、事件侦听的类型定义与注释--拾人牙慧
实际项目中会运到的 Typescript 回调函数.事件侦听的类型定义,如果刚碰到会一脸蒙真的,我就是 这是第一次我自己对 Typescript 记录学习,所以得先说一下我与 Typescript 的 ...
- Java基础语法:类型转换、变量、常量
Java基础语法:类型转换.变量.常量 类型转换 低---------->高 byte,short,char->int->long->float->double 从高到低 ...
- JZOJ 2474. 【GDKOI 2021普及组DAY2】我的世界
题解 这题很明显发现一个点到另一个点,必然最多只有一个进入下界的点和一个出来的点 分类讨论入点和出点的位置 要么都在 \(u->lca\) 或都在 \(lca->v\) 或分别有一个 那就 ...
- JSTL 报错 TagLibraryValidator
今天想要在 JSP 页面上用 JSTL 简化操作,发现导入 jstl.standard 包报错了.我是按照菜鸟上的教程来的.我的 Tomcat 版本是 10.0,之后发现 10.0 版本的 Tomca ...
- Linux 一次性创建多个文件
创建多个文件,文件名数字编号是递增的,在文件名后面加上{n..m}: touch file-{1..10}.txt
- Python:Excel自动化实践入门篇 乙【送图书活动继续】
*以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「englyf」https://mp.weixin.qq.com/s/y-npGelPJwmx3iNvHaXRTg 本文上接<Py ...
- 添加 Echarts bi库
1.安装库和依赖 npm i echarts --save npm i ngx-echarts --save npm i resize-observer-polyfill --save-dev 2.相 ...