目录
一,containerd概述
1,containerd 概述
2,containerd 的主要功能
1. 容器生命周期管理
2. 与底层基础设施交互
3. 与上层系统集成
3,containerd 的核心特点
1. 轻量级与低资源消耗
2. 标准化与开放性
3. 高性能与稳定性
4. 灵活的架构设计
5. 安全增强
4,containerd 与 Docker 的关系
5,containerd的核心组件
1. containerd 守护进程(containerd daemon)
2. shim 进程(containerd-shim)
3. runtime 运行时
4. snapshotter 快照管理器
5. content store 内容存储
6. metadata store 元数据存储
7,storage(存储)
8,Metadata(元数据)
9,Runtime(运行时)
典型应用场景
二,部署containerd
添加软件源信息
修改配置文件
安装containerd
生成配置文件
修改生成的配置文件
创建文件并配置镜像加速
启动服务
三,containerd的基本操作
2. 容器管理命令
3. 命名空间管理命令
4. 内容与存储命令
5. 插件与配置命令
6,挂载镜像命令
一,containerd概述
1,containerd 概述
containerd 是一个开源的容器运行时(Container Runtime),最初由 Docker 公司开发,后来捐赠给 CNCF(云原生计算基金会),成为其孵化项目之一。它是构建在 OCI(开放容器倡议)标准之上的轻量级容器运行时,旨在为容器化应用提供高效、可靠的运行环境。
2,containerd 的主要功能
1. 容器生命周期管理
- 镜像管理:负责容器镜像的拉取、存储、验证和分发,支持从 Docker Hub、私有仓库等多种源获取镜像。
- 容器创建与运行:基于 OCI 标准创建和启动容器,管理容器的启动、停止、暂停、删除等状态。
- 进程管理:监控容器内的进程状态,处理进程异常退出等情况。
2. 与底层基础设施交互
- 资源隔离:利用 Linux 内核特性(如 namespace、cgroup)实现容器间的资源隔离和限制。
- 存储与网络管理:对接存储驱动(如 overlay2、btrfs)和网络插件(如 CNI),为容器提供存储卷和网络连接。
3. 与上层系统集成
- Kubernetes 集成:作为 Kubernetes 的默认容器运行时之一(替代 Docker),通过 CRI(容器运行时接口)与 Kubernetes 无缝对接。
- 多集群与编排支持:支持与容器编排工具(如 Docker Swarm、Nomad)集成,适配不同的部署场景。
3,containerd 的核心特点
1. 轻量级与低资源消耗
- 相比传统 Docker 架构,containerd 去掉了不必要的功能模块,仅保留容器运行时的核心能力,内存占用更低。
- 采用模块化设计,组件间通过 gRPC 通信,减少系统资源开销。
2. 标准化与开放性
- 严格遵循 OCI 标准(容器格式和运行时规范),确保容器在不同平台和工具间的兼容性。
- 开源且社区活跃,支持多种操作系统(Linux、Windows)和硬件架构(x86、ARM)。
3. 高性能与稳定性
- 支持容器的快速启动(毫秒级启动时间),适合大规模微服务部署。
- 具备故障恢复机制,如容器崩溃时自动重启,确保服务连续性。
4. 灵活的架构设计
- 分层架构:分为 runtime(运行时)、shim(垫片进程)和 snapshotter(镜像快照管理),便于扩展和维护。
- 插件机制:通过插件化设计支持自定义存储、网络和监控组件,例如对接 CNI 网络插件。
5. 安全增强
- 支持安全容器(如 Kata Containers),通过轻量级虚拟机隔离容器,提升安全性。
- 集成 Seccomp、AppArmor 等安全机制,限制容器内进程的权限。
4,containerd 与 Docker 的关系
- 历史演进:containerd 最初是 Docker 引擎的底层组件(Docker 1.11 版本后分离),后来独立发展为通用容器运行时。
- 功能差异:Docker 提供完整的开发、打包、部署流程(含 CLI、镜像仓库等),而 containerd 专注于容器运行时的核心功能。
- 当前定位:Kubernetes 从 1.24 版本开始不再支持 Docker,转而推荐使用 containerd 作为容器运行时(通过 cri-containerd 插件对接 CRI)。
5,containerd的核心组件
containerd 采用模块化设计,各组件通过 gRPC 接口通信,形成分层架构。这种设计使得它可以独立运行,也可以作为其他系统的底层容器运行时。
1. containerd 守护进程(containerd daemon)
角色:作为主服务进程,负责管理整个容器生命周期。
功能:
- 监听客户端请求(如创建容器、拉取镜像)。
- 管理镜像和容器的元数据(存储在本地数据库中)。
- 协调其他组件(如 shim、snapshotter)的工作。
通信接口:通过/run/containerd/containerd.sock
提供 gRPC 服务。
2. shim 进程(containerd-shim)
角色:作为容器进程的父进程,负责容器的独立生命周期管理。
功能:
- 隔离容器进程与 containerd 守护进程:即使 containerd 重启,容器仍能继续运行。
- 收集容器的标准输出 / 错误流,并转发给日志驱动。
- 传递信号(如 SIGTERM、SIGKILL)给容器内的主进程。
设计优势:避免单点故障,提升系统稳定性。
3. runtime 运行时
角色:负责容器的实际执行和资源隔离。
分类:
- runC:默认低级别运行时,基于 OCI 规范实现,提供基础的 namespace 和 cgroup 隔离。
- 高级运行时:如 Kata Containers、gVisor,提供更强的安全隔离(通过轻量级虚拟机或用户态内核)。
配置方式:通过config.toml
指定默认运行时,或在创建容器时通过--runtime
参数指定。
4. snapshotter 快照管理器
角色:管理容器镜像的分层存储和容器的读写层。
实现方式:
- overlayfs:默认选项,基于 Linux 的 overlay 存储驱动,性能高。
- btrfs/zfs:提供高级特性(如写时复制、快照),但依赖特定文件系统。
- stargz:优化镜像拉取性能,支持按需加载层(on-demand pulling)。
工作原理: - 镜像层以只读方式挂载,容器的写操作存储在独立的可写层。
- 通过
containerd content store
管理镜像内容的哈希和校验。
5. content store 内容存储
角色:存储和检索容器镜像的内容(blob)。
功能:
- 基于内容寻址(content-addressable storage),通过哈希值标识镜像层。
- 实现镜像层的去重和共享,节省存储空间。
存储位置:默认位于/var/lib/containerd/io.containerd.content.v1.content/
。
6. metadata store 元数据存储
角色:存储容器、镜像、任务的元数据信息。
实现方式:
- 默认使用 BoltDB(嵌入式键值数据库)存储在本地文件系统。
- 支持通过插件扩展为其他存储后端(如 MySQL、PostgreSQL)。
数据示例:容器配置、状态、挂载点、网络设置等。
7,storage(存储)
- Content(内容):功能: Content 存储了容器镜像的实际数据。这包括文件系统层和元数据,用于创建和管理容器的基础文件系统。
- Snapshot(快照):功能:Snapshot 存储容器的快照数据。每个容器都可以有一个或多个快照,允许它们共享相同的文件系统层,提高效率。
- Diff(差异):功能: Diff 存储容器文件系统层之间的差异。当容器运行时需要修改文件系统时,会在已有的文件系统层上创建一个差异层,以保存变更。
8,Metadata(元数据)
-
Images(镜像):功能:Images 存储容器镜像的元数据,包括镜像的标签、大小、创建时间等信息。Metadata 中的 Images组件允许容器对镜像进行管理和操作。
-
Containers(容器):功能: Containers 存储容器的元数据,包括容器的状态、配置信息、网络设置等。这部分元数据使得容器能够有效地管理容器的生命周期。
9,Runtime(运行时)
-
Tasks(任务):功能:Tasks 包含容器内的进程组。每个容器运行时都有关联的 Task,它负责管理容器内的所有进程Tasks 与 Shim 一起工作,维护容器的状态。
-
Events(事件):功能: Events 组件记录了容器的各种事件,如容器的创建、启动、停止等。这些事件可以用于监控和日志记录,帮助用户了解容器系统的运行状况。
6,典型应用场景
- 云原生基础设施:作为 Kubernetes 集群的容器运行时,支撑大规模微服务部署。
- 边缘计算:在资源受限的边缘节点上运行轻量级容器,降低资源消耗。
- 高性能计算:利用 containerd 的快速启动和低开销特性,优化批量任务的容器化部署。
二,部署containerd
添加软件源信息
curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
修改配置文件
sed -i 's/$releasever/8/g' /etc/yum.repos.d/docker-ce.repo
sed -i 's/$basearch/x86_64/g' /etc/yum.repos.d/docker-ce.repo
安装containerd
dnf -y install containerd.io
生成配置文件
mkdir -p /etc/containerd
containerd config default | tee /etc/containerd/config.toml
- tee 命令通常用来读取标准输入,并将其内容写入文件和输出到终端。
- /etc/containerd/config.toml是 containerd的配置文件路径,这里指定了配置文件的具体位置
- 使用 containerd config default 命令获取 containerd 的默认配置信息
- 通过管道|将这些配置信息传递给 tee 命令
修改生成的配置文件
vim /etc/containerd/config.toml
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.6" 63行修改
SystemdCgroup = true 127修改
config_path = "/etc/containerd/certs.d" 147行修改
创建文件并配置镜像加速
mkdir -p /etc/containerd/certs.d/docker.io
mkdir -p /etc/containerd/certs.d/registry.k8s.io
touch -p /etc/containerd/certs.d/docker.io/hosts.toml
vim /etc/containerd/certs.d/docker.io/hosts.toml
server = "docker.io"
[host."https://docker.m.daocloud.io"]
capabilities = ["pull","resolve"][root@localhost certs.d]# vim registry.k8s.io/hosts.toml
server = "registry.k8s.io"
[host."https://registry.aliyuncs.com/google_containers"]
capabilities = ["pull","resolve"]
override_path = true
启动服务
[root@localhost certs启动服务.d]# systemctl restart containerd
[root@localhost certs.d]# systemctl status containerd
三,containerd的基本操作
1,镜像管理命令
命令格式 | 功能描述 |
---|---|
ctr images pull <镜像地址> | 从镜像仓库拉取镜像(例如:ctr images pull docker.io/library/nginx:latest ) |
ctr images push <镜像地址> | 将镜像推送到指定仓库 |
ctr images ls | 列出本地所有镜像 |
ctr images rm <镜像名称> | 删除本地镜像 |
ctr images tag <源镜像> <目标镜像> | 为镜像添加标签 |
ctr images export <镜像> <文件.tar> | 将镜像导出为 tar 文件 |
ctr images import <文件.tar> | 从 tar 文件导入镜像 |
2. 容器管理命令
命令格式 | 功能描述 |
---|---|
ctr containers create <镜像> <容器ID> | 创建容器(但不启动) |
ctr tasks start <容器ID> | 启动已创建的容器 |
ctr tasks stop <容器ID> | 停止运行中的容器 |
ctr tasks kill <容器ID> <信号> | 向容器发送信号(如 SIGTERM ) |
ctr tasks ls | 列出所有运行中的容器 |
ctr containers ls | 列出所有容器(包括未运行的) |
ctr containers rm <容器ID> | 删除容器 |
ctr exec --tty --exec-id <ID> <容器ID> <命令> | 在容器内执行命令(如:ctr exec -t <ID> sh ) |
3. 命名空间管理命令
命令格式 | 功能描述 |
---|---|
ctr namespaces create <命名空间> | 创建新的命名空间(默认命名空间为 default ) |
ctr namespaces ls | 列出所有命名空间 |
ctr namespaces rm <命名空间> | 删除命名空间 |
ctr --namespace <命名空间> <命令> | 在指定命名空间执行命令(如:ctr -n k8s.io images ls ) |
4. 内容与存储命令
命令格式 | 功能描述 |
---|---|
ctr content ls | 列出所有存储的内容(blobs) |
ctr content retrieve <digest> | 获取指定内容的详细信息 |
ctr snapshots ls | 列出所有快照 |
ctr snapshots stats | 查看快照统计信息 |
5. 插件与配置命令
命令格式 | 功能描述 |
---|---|
ctr plugins ls | 列出所有已加载的插件 |
ctr version | 查看 containerd 版本信息 |
ctr config default | 生成默认配置文件(可重定向到 config.toml ) |
6,挂载镜像命令
命令格式 | 功能描述 |
---|---|
ctr runtime list | 列出可用的运行时(如 runc 、kata-runtime ) |
ctr images mount <镜像> <挂载点> | 将镜像挂载到本地文件系统 |
ctr images unmount <挂载点> | 卸载已挂载的镜像 |