Containerd 容器技术详解

目录

一.Containerd 概述

1.什么是 Containerd

2.Containerd 的起源与背景

二.Containerd 架构

1.Containerd 架构概述

2.核心组件解析

(1).Storage(存储组件)

(2).Metadata(元数据管理)

(3).Runtime(运行时管理)

三.安装配置 Containerd

1.安装 Containerd

2.配置 Containerd

(1).生成配置文件

(2).配置镜像加速

(3).启动服务

四.镜像操作

1.拉取镜像

2.查看镜像

3.检测本地镜像

4.重新打标签

5.删除镜像

6.镜像挂载到主机目录

7.镜像从主机目录卸载

8.镜像导出

9.镜像导入

五.容器类操作

1.创建容器

2.列出容器

3.查看容器的详细信息

4.删除容器​

六.任务操作

1.启动容器

2.查看容器

3.进入容器里面

4.暂停容器

5.恢复容器

6.杀死容器

7.删除任务

8.删除容器

9.获取容器的内存、CPU 和 PID 的限额与使用量

10.查看容器中所有进程在宿主机中的 PID

七.插件

八.命名空间

1.查看当前有哪些命名空间

2.创建命名空间

3.删除命名空间

 4.拉取镜像到指定命名空间

5.创建指定命名空间下的容器并查看

6.创建指定命名空间下的任务并查看


一.Containerd 概述

1.什么是 Containerd

        Containerd(Container Daemon)是一个开源的容器运行时,它提供了一种标准化的方式来管理容器的生命周期。该项目最初是由 Docker 开发团队创建的,并在后来成为一个独立的项目,被纳入了 Cloud Native Computing Foundation(云原生计算基金会 CNCF)的孵化项目中

特性描述
容器生命周期管理Containerd 管理容器的生命周期,包括容器的创建、运行、暂停、恢复、停止和销毁等操作
标准化接口Containerd 提供了一个标准化的容器运行时接口,使得它可以与多个容器编排系统和工具集成,例如 Kubernetes、Docker Compose 等
镜像管理它支持容器镜像的拉取、推送、保存和加载等操作。Containerd 使用 OCI(Open Container Initiative)规范定义容器镜像的格式
插件体系结构Containerd 具有可扩展的插件体系结构,允许用户通过插件来扩展其功能,例如存储驱动、网络插件等
跨平台支持Containerd 可以在不同的操作系统上运行,从而提供了跨平台的支持
与 Kubernetes 集成Containerd 作为 Kubernetes 的默认容器运行时,与 Kubernetes 紧密集成,为容器工作负载的管理提供了良好的支持
安全性和隔离Containerd 实现了严格的容器隔离和安全性措施,确保容器之间的隔离性以及对主机系统的安全性

        总体而言,Containerd 提供了一个轻量级、高度可定制的容器运行时,为容器生态系统的发展提供了一个稳定和可靠的基础。它在容器生命周期管理、镜像管理和插件支持等方面为用户提供了丰富的功能

2.Containerd 的起源与背景

        Containerd 的起源可以追溯到 Docker 项目。Docker 最初作为一个开源项目推出,旨在简化应用程序的打包、分发和部署过程。Docker 引入了容器的概念,将应用程序和其依赖项打包到一个容器中,使得应用在不同环境中可以一致地运行。
        随着 Docker 的发展,其架构逐渐变得复杂,包含了许多功能,如镜像构建、服务编排等。为了更好地组织和管理这些功能,Docker 团队决定将 Docker 引擎拆分成多个组件,其中一个关键的组件就是 Containerd。

类别详情
Docker 架构拆分从单一大型引擎拆分为系列小型、可复用组件,目标是提升可维护性、模块化与可扩展性
Containerd 作为核心运行时Docker 架构拆分后,被定位为 Docker 核心容器运行时,负责管理容器生命周期、镜像操作和基本运行时功能
贡献给 CNCF(云原生基金会)Docker 团队为推动其发展,将 containerd 代码捐赠给 Cloud Native Computing Foundation(CNCF),使其成 CNCF 孵化项目
容器生态系统的标准化设计遵循 Open Container Initiative(开放容器倡议 OCI)规范,该规范关注容器运行时和镜像格式标准化,意味着 containerd 可与符合 OCI 规范的其他容器工具和运行时互操作
独立的容器运行时不局限于 Docker,可作为独立容器运行时,与多个容器编排系统和工具集成,给用户更多选择

        总体而言,containerd 的起源是为了简化容器运行时的管理,并为容器生态系统提供一个开放、标准化的基础。其发展不仅服务于 Docker 生态系统,还为整个容器领域提供了一个通用的、可扩展的容器运行时

二.Containerd 架构

1.Containerd 架构概述

        Containerd 的架构是 modularity(模块化)和可扩展性的体现,它被设计为一个轻量级、高度可定制的容器运行时。

  可以看出 Containerd 采用的也是 C/S 架构,服务端通过 unix domain socket 暴露低层的 gRPCAPI 接口出去,客户端通过这些 API 管理节点上的容器,每个 Containerd 只负责一台机器,Pull镜像,对容器的操作(启动、停止等),网络,存储都是由 containerd 完成。具体运行容器由 runc 负责。
       为了解耦,Containerd 将系统划分成了不同的组件,每个组件都由一个或多个模块协作完成(core部分),每一种类型的模块都以插件的形式集成到Containerd 中。

2.核心组件解析

Containerd 组件大致分为 Storage、Metadata 和 Runtime 这三个主要方面。

(1).Storage(存储组件)

组件功能描述技术细节
Content存储容器镜像的二进制数据(文件系统层、配置等)- 使用内容可寻址存储(CAS)机制
- 支持压缩/解压缩(gzip/zstd)
- 通过摘要(Digest)校验数据完整性
Snapshot管理容器文件系统的快照(基于COW技术)- 支持多种驱动(overlayfs、btrfs、devicemapper)
- 快照树实现层共享(减少存储占用)
Diff存储文件系统层间的差异数据- 通过AUFS/Overlay2实现高效差异合并
- 支持白名单过滤(忽略特定文件变更)

(2).Metadata(元数据管理)

组件功能描述技术细节
Images管理镜像元数据(标签、层级关系、创建时间等)- 兼容OCI镜像规范
- 支持多仓库镜像拉取(Docker Hub、私有仓库)
- 支持镜像垃圾回收
Containers管理容器元数据(配置、状态、网络等)- 存储OCI运行时规范(runtime-spec)配置
- 与CRI(Container Runtime Interface)深度集成

(3).Runtime(运行时管理)

组件功能描述技术细节
Tasks管理容器内进程组(PID命名空间隔离)- 通过containerd-shim托管进程
- 支持进程生命周期钩子(hooks)
- 与runc/gVisor等运行时交互
Events记录容器生命周期事件(创建/启动/停止等)- 基于TTRPC协议实现实时事件流
- 支持事件过滤(如仅记录错误事件)
- 与Prometheus监控集成

关键交互关系

三.安装配置 Containerd

1.安装 Containerd

#step 2:添加软件源信息

#列出可用版本

#安装 containerd

2.配置 Containerd

(1).生成配置文件

(2).配置镜像加速

修改配置文件

(3).启动服务

四.镜像操作

1.拉取镜像

2.查看镜像

查看本地有哪些镜像可以使用 ctr images ls,默认査看到的的是 default 命名空间的镜像

査看 crictl拉取的镜像 :

3.检测本地镜像

主要査看其中的 STATUS,complete 表示镜像是完整可用的状态。

命令格式:
ctr images check

4.重新打标签

命令格式:
ctr images tag 当前镜像名称 新镜像名称

5.删除镜像

6.镜像挂载到主机目录

7.镜像从主机目录卸载

8.镜像导出

9.镜像导入

五.容器类操作

         Containerd 本身并没有直接支持端口映射的功能。端口映射通常是由容器运行时(比如 Docker、CRI-0)负责的,而不是容器的底层运行时(containerd)。

1.创建容器

# 基于 docker.io/library/nginx:latest 镜像创建一个叫 nginx 的容器

2.列出容器

3.查看容器的详细信息

4.删除容器

六.任务操作

        通过 container create 命令创建的容器,并没有处于运行状态,只是一个静态的容器(仅仅只是一个创建容器的声明)。一个 container 对象只是包含了运行一个容器所需的资源及相关配置数据,表示 namespaces、rootfs 和容器的配置都已经初始化成功了,只是用户进程还没有启动。
一个容器真正运行起来是由 Task 任务实现的。

1.启动容器

#启动任务的时候要先有容器    #-d 放入后台

2.查看容器

3.进入容器里面

#进入到容器里面
#不过这里需要注意必须要指定 --exec-id 参数,这个 id 可以随便写,只要唯一就行

4.暂停容器

5.恢复容器

6.杀死容器

#杀死容器,ctr 没有stop 容器的功能,只能暂停或者杀死容器

7.删除任务

注:
虽然已经删除了任务,但是创建容器的时候,也创建了一个同名的快照,即便已经删除了任务,也可以使用“ctr task start -d nginx”命令,利用此快照将已删除的任务启动起来,使得此容器恢复运行。

8.删除容器

注意:
删除容器后快照也就没有了

9.获取容器的内存、CPU 和 PID 的限额与使用量

指标名称示例值单位说明典型场景分析
memory.usage_in_bytes19223372036854771712字节容器内存使用量该值接近2^64,表示未设置内存限制(--memory未指定或设为0)
memory.stat.cacheθ(未提供具体数值)字节内存缓存大小(Page Cache/Slab Cache)高缓存值可能表示频繁的文件IO操作
cpuacct.usage36365002纳秒容器累计CPU使用时间(所有核总和)约36毫秒,表示轻量级任务
cpuacct.usage_percpu[16788433, 19576569]纳秒各CPU核的使用时间核间负载均衡良好(差异<15%)
pids.currentθ(未提供具体数值)容器内活跃进程数量空值可能表示未启用PID cgroup限制
pids.limitθ(未提供具体数值)容器允许的最大进程数空值通常表示无限制(需结合docker run --pids-limit或k8s pod.spec.pids配置)

10.查看容器中所有进程在宿主机中的 PID

#先启动一个容器

#查看所有进程在宿主机的 pid

七.插件

        在 Containerd 中,插件是一种机制,允许你通过加载和卸载插件来扩展 Containerd 的功能。插件可以提供不同的功能,例如容器存储、网络、监控等。Containerd 使用插件化的设计,使其可以适应各种不同的容器运行时和容器生态系统需求。

插件类型功能描述
Shim 插件负责管理容器的生命周期,容器任务启动时调用创建并监管容器进程,负责与容器进程通信、监控容器状态
Snapshotter 插件处理容器的文件系统快照(Snapshots),定义容器文件系统结构,支持创建、管理和销毁快照,以及在不同容器间共享文件系统层
Task 插件用于管理容器中的任务(Task),任务为容器内运行的一个或多个进程,与容器生命周期直接相关
Image 插件负责处理容器镜像的拉取、推送、删除等操作,定义容器镜像的存储和元数据结构
Content Store 插件管理容器内容(Content),包括镜像层和元数据,定义内容的存储和检索方式

        这些插件允许用户根据实际需求选择性地配置 Containerd,并与其他容器运行时和编排系统进行集成。例如,通过选择不同的快照插件,你可以定制 Containerd 的文件系统管理方式。通过选择不同的网络插件,你可以适应不同的网络模型和需求。

        插件化的设计使得 Containerd 可以灵活地适应不同的使用场景,并且可以方便地进行定制和扩展。

        每个插件都提供了标准化的接口,使得插件可以被轻松地替换或新增,从而满足不同用户和组织的需求。

列出当前所有插件

八.命名空间

        在 Containerd 中,命名空间(Namespace)是一种用于隔离资源和进程视图的 Linux 内核特性。命名空间允许在同一主机上运行的进程拥有不同的资源视图,从而实现资源隔离。Containerd 利用 Linux 的命名空间实现容器的隔离

命名空间类型隔离内容作用
PID 命名空间进程 ID 空间让不同命名空间的进程似在独立系统运行,确保容器进程不影响主机其他进程
Network 命名空间网络栈使容器网络环境独立于主机,容器可拥有自己网络接口、IP 地址、端口,不影响其他容器和主机网络配置
Mount 命名空间文件系统挂载点让容器有自己文件系统视图,各容器文件系统互不影响
UTS 命名空间主机名和域名允许容器有自己的主机名和域名
IPC 命名空间进程间通信(IPC)资源阻止容器内进程直接与主机或其他容器共享 IPC 资源
User 命名空间用户和用户组视图容器内进程可按容器内用户 / 组身份运行,不影响主机实际用户 / 组

        这些命名空间的组合使得容器可以在相对独立的环境中运行,避免了与主机系统或其他容器的干扰。Containerd 利用这些命名空间实现容器的隔离和资源管理,确保容器化应用在共享主机资源的同时获得适当的隔离

1.查看当前有哪些命名空间

2.创建命名空间

3.删除命名空间

 4.拉取镜像到指定命名空间

5.创建指定命名空间下的容器并查看

6.创建指定命名空间下的任务并查看

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值