Containerd 容器技术
一、Containerd 概述
(一)什么是 Containerd
Containerd(Container Daemon)是一个开源的容器运行时,最初由 Docker 开发团队创建,后成为 CNCF(云原生计算基金会)的孵化项目。它提供了标准化的方式来管理容器的生命周期,包括创建、运行、暂停、恢复、停止和销毁等操作。作为轻量级、高度可定制的容器运行时,Containerd 遵循 OCI(Open Container Initiative)规范,支持与 Kubernetes、Docker Compose 等多种编排系统集成,是云原生生态中的核心组件之一。
(二)Containerd 的主要特点与功能
- 容器生命周期管理:完整覆盖容器从创建到销毁的全流程操作,确保容器状态可控。
- 标准化接口:通过 gRPC API 提供统一接口,实现与 Kubernetes 等编排工具的无缝对接。
- 镜像管理:支持镜像的拉取、推送、保存、加载等操作,遵循 OCI 镜像格式标准。
- 插件体系结构:通过插件扩展功能,如存储驱动、网络插件等,提升系统灵活性。
- 跨平台支持:可在不同操作系统上运行,满足多环境部署需求。
- 与 Kubernetes 集成:作为 Kubernetes 默认容器运行时,提供高效的工作负载管理支持。
- 安全性与隔离:利用 Linux 命名空间实现容器隔离,保障主机与容器间的安全边界。
(三)Containerd 的起源与背景
Containerd 的发展源于 Docker 项目的架构拆分。早期 Docker 作为单一引擎,集成了镜像构建、服务编排等复杂功能,为提升可维护性与模块化,Docker 团队将引擎拆分为多个组件,Containerd 作为核心运行时被独立出来。随后,Docker 将 Containerd 捐赠给 CNCF,推动其成为开放标准的容器运行时。其设计遵循 OCI 规范,确保与其他符合 OCI 标准的容器工具互操作,逐步成为独立于 Docker 的通用容器运行时。
二、Containerd 架构解析
(一)架构概述
Containerd 采用 C/S(客户端 / 服务器)架构,服务端通过 Unix Domain Socket 暴露 gRPC API,客户端通过 API 管理容器生命周期、镜像操作等。系统设计遵循模块化原则,各组件以插件形式集成,包括 Storage(存储)、Metadata(元数据)、Runtime(运行时)等核心模块,支持灵活扩展。
(二)核心组件解析
1. Storage(存储)组件
- Content(内容):存储容器镜像的实际数据,包括文件系统层和元数据,为容器提供基础文件系统。
- Snapshot(快照):存储容器的快照数据,允许容器共享文件系统层,提升存储效率。
- Diff(差异):记录容器文件系统层之间的变更,通过差异层保存修改内容,避免重复存储。
2. Metadata(元数据)组件
- Images(镜像):存储镜像元数据,如标签、大小、创建时间等,支持镜像管理操作。
- Containers(容器):管理容器生命周期的元数据,记录容器配置与状态信息。
3. Runtime(运行时)组件
- Tasks(任务):包含容器内的进程组,与 Shim 协作维护容器状态,管理进程生命周期。
- Events(事件):记录容器操作事件(如创建、启动、停止),用于监控和日志记录。
(三)架构图与组件交互
Containerd 架构图展示了从客户端到核心组件的调用链:客户端(如 ctr、kubelet)通过 gRPC API 访问服务端,服务端组件(如 Containers Service、Content Service)调用核心模块(Metadata、Storage),最终通过 Backend 插件(如 Snapshotter、Runtime Shim)与底层系统交互。例如,创建容器时,客户端发送请求至 Containers Service,该服务调用 Metadata 中的 Containers 组件记录配置,同时通过 Storage 的 Snapshot 创建文件系统快照,最后由 Runtime 的 Task 启动容器进程。
三、Containerd 安装与配置
(一)安装步骤
1. 添加软件源
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
以上命令将阿里云 Docker CE 源配置到系统,并适配 CentOS 8 的 x86_64 架构。
2. 列出可用版本
yum list containerd.io --showduplicates
通过该命令可查看所有可用的 Containerd 版本,便于选择合适版本安装。
3. 安装 Containerd
yum -y install containerd.io
执行此命令安装最新版 Containerd。
(二)配置 Containerd
1. 生成默认配置文件
bash
mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
该操作创建配置目录并生成默认配置文件,containerd config default命令获取默认配置,通过tee命令写入文件并显示到终端。
2. 配置镜像加速
修改配置文件/etc/containerd/config.toml,添加镜像加速配置:
[plugins."io.containerd.grpc.v1.cri".registry]
config_path = "/etc/containerd/certs.d"
创建证书目录并配置 Docker Hub 和 Kubernetes 镜像源的加速地址:
mkdir -p /etc/containerd/certs.d/docker.io
mkdir -p /etc/containerd/certs.d/registry.k8s.io
cat <<EOF | sudo tee /etc/containerd/certs.d/docker.io/hosts.toml
server = "docker.io"
[host."https://docker.m.daocloud.io"]
capabilities = ["pull", "resolve"]
EOF
cat <<EOF | sudo tee /etc/containerd/certs.d/registry.k8s.io/hosts.toml
server = "registry.k8s.io"
[host."https://registry.aliyuncs.com/google_containers"]
capabilities = ["pull", "resolve"]
override_path = true
EOF
以上配置通过 DaoCloud 加速 Docker Hub 镜像,通过阿里云加速 Kubernetes 镜像,提升拉取度。
3. 启动服务
systemctl restart containerd
systemctl status containerd
重启并检查 Containerd 服务状态,确保服务正常运行。
4. 验证安装
ctr version
输出示例:
Client:
Version: 1.6.6
Revision: 10c12954828e7c7c9b6e0ea9b0c02b01407d3ae1
Go version: go1.17.11
Server:
Version: 1.6.6
Revision: 10c12954828e7c7c9b6e0ea9b0c02b01407d3ae1
UUID: 067172f0-071d-44c2-bdea-9c402ad39745
确认客户端与服务端版本一致,安装成功。
四、Containerd 基本操作
(一)镜像类操作
拉取镜像
全平台拉取:
ctr images pull docker.io/library/nginx:latest --all-platforms --hosts-dir=/etc/containerd/certs.d/
- 指定平台拉取:
ctr images pull docker.io/library/nginx:latest --platform linux/amd64 --hosts-dir=/etc/containerd/certs.d/
--all-platforms参数下载所有平台镜像,--platform指定具体平台,--hosts-dir指定证书目录以使用镜像加速。
2. 查看镜像
ctr images ls
输出示例:
REF TYPE DIGEST SIZE PLATFORMS LABELS
docker.io/library/nginx:latest application/vnd.oci.image.index.v1+json sha256:91734281c0ebfc6f1aea979cffeed5079cfe786228a71cc6f1f46a228cde6e3468.8 MiB linux/386,linux/amd64,linux/arm/v5,linux/arm/v7,linux/arm64/v8,linux/mips64le,linux/ppc64le,linux/s390x
默认查看default命名空间的镜像,通过-n k8s.io可查看指定命名空间的镜像。
3. 检测本地镜像
ctr images check
重点查看STATUS字段,complete表示镜像完整可用。4. 重新打标签
ctr images tag docker.io/library/nginx:latest nginx:v1
ctr images tag docker.io/library/nginx:latest nginx:v2
为镜像添加新标签,便于管理和引用。
5. 删除镜像
ctr images rm nginx:v2
ctr images rm docker.io/library/nginx_new:v1
删除指定标签的镜像,若镜像被容器引用,需先删除容器。
6. 镜像挂载与卸载
- 挂载到主机目录:
ctr images mount nginx:v1 /mnt
挂载后可通过ls /mnt查看镜像文件系统。 - 卸载镜像:
卸载已挂载的镜像目录。ctr images unmount /mnt/
7. 镜像导出与导入
- 导出镜像:
# 全平台导出 ctr images export --all-platforms nginx_latest.tar docker.io/library/nginx:latest # 指定平台导出 ctr images export --platform linux/amd64 nginx_latest.tar docker.io/library/nginx:latest - 导入镜像:
# 全平台导入 ctr images import nginx_latest.tar # 指定平台导入 ctr images import --platform linux/amd64 nginx_latest.tar
导出镜像为 tar 包,可在其他环境中导入使用,--all-platforms保留所有平台数据。
(二)容器类操作
1. 创建容器
ctr containers create nginx:v1 nginx
基于nginx:v1镜像创建名为nginx的容器,此时容器处于未运行状态。
2. 列出与查看容器
ctr containers ls
ctr containers info nginx
ls命令查看容器列表,info命令获取容器详细配置信息。
3. 删除容器
ctr containers rm nginx
删除未运行的容器,若容器正在运行,需先停止任务。
(三)任务类操作
1. 启动容器
ctr containers create nginx:v1 nginx
ctr task start -d nginx
先创建容器,再通过task start启动任务,-d参数使容器在后台运行。
2. 查看容器状态
ctr task ls
输出示例:
TASK PID STATUS
nginx 12774 RUNNING
显示容器任务的 PID 和运行状态。
3. 进入容器
ctr task exec --exec-id 0 -t nginx sh
--exec-id指定执行 ID(需唯一),-t分配终端,进入容器后可执行命令。
4. 控制容器状态
- 暂停容器:
ctr task pause nginx - 恢复容器:
ctr task resume nginx - 杀死容器:
ctr task kill nginx
Containerd 不提供stop命令,通过kill停止容器进程。
5. 删除任务与容器
ctr task rm nginx
ctr container rm nginx
先删除任务,再删除容器,删除容器后对应的快照会自动删除。
6. 查看容器资源使用
ctr task metrics nginx
输出示例
ID TIMESTAMP
nginx 2023-11-27 08:58:19.17333324+0000 UTC
METRIC VALUE
memory.usage_in_bytes 0
memory.limit_in_bytes 9223372036854771712
memory.stat.cache 0
cpuacct.usage 36365002
cpuacct.usage_percpu [16788433 19576569]
pids.current 0
pids.limit 0
显示容器的内存、CPU、进程数等资源使用情况及限额。
7. 查看容器进程 PID
ctr task ps nginx
ps -ef | grep <PID>
ctr task ps获取容器内进程在宿主机的 PID,通过ps命令查看进程详情。
五、Containerd 插件与命名空间
(一)插件机制
1. 插件类型
- Shim 插件:管理容器生命周期,处理容器进程的创建与监管。
- Snapshotter 插件:处理文件系统快照,支持创建、共享、销毁快照。
- Task 插件:管理容器内的任务进程,关联容器生命周期。
- Image 插件:处理镜像拉取、推送等操作,定义镜像存储结构。
- Content Store 插件:管理镜像内容(如镜像层),定义存储与检索方式。
2. 管理插件
- 列出插件:
ctr plugins ls
输出示例(部分):TYPE ID PLATFORMS STATUS io.containerd.content.v1 content ok io.containerd.snapshotter.v1 aufs linux/amd64 skip io.containerd.snapshotter.v1 overlayfs linux/amd64 ok
显示插件类型、ID、支持平台及状态。
(二)命名空间
1. 命名空间类型
Containerd 利用 Linux 命名空间实现容器隔离:
- PID 命名空间:隔离进程 ID 空间,容器进程与主机进程互不干扰。
- Network 命名空间:隔离网络栈,容器拥有独立网络接口与 IP。
- Mount 命名空间:隔离文件系统挂载点,容器有独立文件系统视图。
- UTS 命名空间:隔离主机名与域名,容器可自定义主机名。
- IPC 命名空间:隔离进程间通信资源,保障容器间通信安全。
- User 命名空间:隔离用户与用户组,容器内进程可使用不同用户身份。
2. 命名空间操作
- 查看命名空间:
ctr ns ls - 创建命名空间:
ctr ns create test - 删除命名空间:
ctr ns rm test - 在指定命名空间操作:
ctr -n test images pull docker.io/library/nginx:latest --platform linux/amd64 ctr -n test containers create nginx:v1 nginx03 ctr -n test task start -d nginx03
通过-n参数指定命名空间,实现资源隔离管理。
六、本章总结
(一)Containerd 核心价值
Containerd 作为云原生容器运行时,通过标准化接口与模块化设计,为容器生命周期管理、镜像操作、资源隔离提供了可靠支持。其与 Kubernetes 的深度集成,以及插件化扩展能力,使其成为现代容器部署的核心组件。
(二)关键知识点回顾
- 架构设计:C/S 架构、模块化组件(Storage/Metadata/Runtime)、插件机制。
- 安装配置:软件源配置、镜像加速、服务启动与验证。
- 基本操作:镜像管理(拉取 / 查看 / 导出等)、容器与任务的生命周期控制🔶1-107。
- 扩展能力:插件类型与管理、命名空间实现资源隔离。
更多推荐



所有评论(0)