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 ...
随机推荐
- Salesforce LWC学习(四十二) getRecordNotifyChange已弃用
本篇参考: https://developer.salesforce.com/docs/component-library/documentation/en/lwc/lwc.reference_get ...
- (原创)【B4A】一步一步入门03:APP名称、图标等信息修改
一.前言 上篇 (原创)[B4A]一步一步入门02:可视化界面设计器.控件的使用 中我们已经了解了B4A程序的基本框架,现在我们还进一步讲解. 本篇文章会讲解如何修改APP的名称.图标等信息,以让一个 ...
- SqlServer Express 自动备份数据库(没有sql代理服务的情况下)
一.由于Express版本的SQLServer没有SQL代理服务(SQLSERVERAGENT),所以就不能通过SQLServer作业来进行自动备份了,那么我们可以用Windows计划任务来定时处理 ...
- 下午小博(java小知识)
抽象类: 抽象类中可以构造方法 抽象类中可以存在普通属性,方法,静态属性和方法 抽象类中可以存在抽象方法如果一个类中有一个抽象方法,那么当前类一定是抽象类:抽象类中不一定有抽象方法 抽象类中的抽象方法 ...
- 使用 DirectSound 播放 WAV 文件
使用 DirectSound 播放 WAV 文件 本文需要的前置知识可以在之前的这两篇文章找到. WAVE音频文件格式及其64位扩展格式的简要介绍 读写wav格式文件 基于本文介绍的方法,我们也可以用 ...
- Window10环境下,Stable Diffusion的本地部署与效果展示
Diffusion相关技术最近也是非常火爆,看看招聘信息,岗位名称都由AI算法工程师变成了AIGC算法工程师,本周跟大家分享一些Diffusion算法相关的内容. Window10环境下,Stable ...
- Mac监控键盘输入并执行动作
背景 电脑的安全是非常重要的,特别是里面的敏感数据,若是被有心之人利用,那后果不堪设想. 所以我们部门定下了一个规矩,谁离开工位要是不锁屏,就可以在部门群发送一个消息:我请大家吃鸡翅. oh,技术出身 ...
- 初学 Socket.io
概念 Socket.io 是一个支持客户端和服务器之间的低延迟.双向和基于事件的通信的库,除了支持 JavaScript 以外,还支持 Java.Python.Golang. Socket.io 构建 ...
- Ubuntu中用普通方法无法添加自启动
参考了https://www.cnblogs.com/a5idc/p/13752839.html 如何知道你使用的是哪个init系统?你可以使用这个命令来知道与PID 1(系统上运行的第一个进程)相关 ...
- js手动触发页面元素点击事件,自定义点击事件模拟点击
// initEvent事件已经弃用1. 创建MouseEvents事件const clickEvent = document.createEvent('MouseEvents')2. 初始化点击事件 ...