一、Containerd 概述

(一)什么是 Containerd

Containerd(Container Daemon)是一个开源的容器运行时,最初由 Docker 开发团队创建,后成为 CNCF(云原生计算基金会)的孵化项目。它提供了标准化的方式来管理容器的生命周期,包括创建、运行、暂停、恢复、停止和销毁等操作。作为轻量级、高度可定制的容器运行时,Containerd 遵循 OCI(Open Container Initiative)规范,支持与 Kubernetes、Docker Compose 等多种编排系统集成,是云原生生态中的核心组件之一。

(二)Containerd 的主要特点与功能

  1. 容器生命周期管理:完整覆盖容器从创建到销毁的全流程操作,确保容器状态可控。
  2. 标准化接口:通过 gRPC API 提供统一接口,实现与 Kubernetes 等编排工具的无缝对接。
  3. 镜像管理:支持镜像的拉取、推送、保存、加载等操作,遵循 OCI 镜像格式标准。
  4. 插件体系结构:通过插件扩展功能,如存储驱动、网络插件等,提升系统灵活性。
  5. 跨平台支持:可在不同操作系统上运行,满足多环境部署需求。
  6. 与 Kubernetes 集成:作为 Kubernetes 默认容器运行时,提供高效的工作负载管理支持。
  7. 安全性与隔离:利用 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 的深度集成,以及插件化扩展能力,使其成为现代容器部署的核心组件。

(二)关键知识点回顾

  1. 架构设计:C/S 架构、模块化组件(Storage/Metadata/Runtime)、插件机制。
  2. 安装配置:软件源配置、镜像加速、服务启动与验证。
  3. 基本操作:镜像管理(拉取 / 查看 / 导出等)、容器与任务的生命周期控制🔶1-107。
  4. 扩展能力:插件类型与管理、命名空间实现资源隔离。
Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐