目录

简介

一、Containerd概念与起源

1. 什么是Containerd?

2. Containerd的起源与发展历程

二、Containerd架构

1. 存储(Storage)模块

2. 元数据(Metadata)模块

3. 运行时(Runtime)模块

架构特点

三、Containerd环境部署

1. 安装Containerd(CentOS示例)

2. 生成与配置Containerd默认文件

四、Containerd核心操作

1. 镜像管理操作

2. 容器与任务管理

3. 插件与命名空间管理

五、Containerd与Kubernetes的集成

总结


简介

在容器技术飞速发展的今天,Containerd作为云原生计算基金会(CNCF)的孵化项目,已成为Kubernetes默认的容器运行时。它最初由Docker团队开发,旨在提供标准化的容器生命周期管理能力。与Docker相比,Containerd更专注于容器运行时的核心功能,以轻量级、模块化和可扩展的特性,成为现代容器生态系统的基石。

一、Containerd概念与起源

1. 什么是Containerd?

Containerd(Container Daemon)是一个开源容器运行时,专注于容器生命周期管理、镜像操作和运行时环境构建。其核心特点包括:

  • 生命周期管理:支持容器创建、运行、暂停、恢复、停止和销毁等全流程操作
  • 标准化接口:遵循OCI(Open Container Initiative)规范,可与Kubernetes、Docker Compose等编排工具无缝集成
  • 镜像管理:支持镜像拉取、推送、存储和分发,基于OCI镜像格式标准
  • 插件体系结构:通过插件扩展功能,如存储驱动、网络插件、监控插件等
  • 跨平台支持:兼容Linux、Windows等多平台环境
  • 安全隔离:基于Linux命名空间和Cgroup实现容器隔离与资源控制
2. Containerd的起源与发展历程

Containerd的诞生与Docker的架构演进密切相关:

  • Docker架构拆分:随着Docker功能膨胀,团队将其拆分为多个轻量级组件,Containerd作为核心运行时独立出来
  • 捐赠给CNCF:2017年,Docker将Containerd代码捐赠给CNCF,推动容器技术标准化
  • OCI规范兼容:Containerd遵循OCI标准,实现与其他容器工具的互操作性
  • 独立运行时定位:不仅服务于Docker,还作为Kubernetes默认运行时,支持多编排系统集成

二、Containerd架构

Containerd采用客户端-服务器(C/S)架构,通过UNIX Domain Socket暴露gRPC API,核心组件可分为三大模块:

1. 存储(Storage)模块
  • Content:存储容器镜像的实际数据,包括文件系统层和元数据
  • Snapshot:管理容器文件系统快照,支持多容器共享文件系统层
  • Diff:记录文件系统层之间的差异,以增量方式保存变更
2. 元数据(Metadata)模块
  • Images:存储镜像元数据(标签、大小、创建时间等)
  • Containers:管理容器生命周期的元数据配置
3. 运行时(Runtime)模块
  • Tasks:管理容器内的进程组,与Shim协作维护容器状态
  • Events:记录容器生命周期事件(创建、启动、停止等),用于监控和日志
架构特点

Containerd通过插件机制实现高度可扩展,常见插件类型包括:

  • Shim插件:管理容器进程生命周期
  • Snapshotter插件:处理文件系统快照(支持overlayfs、btrfs等)
  • Runtime插件:支持不同运行时(runc、kata-containers等)
  • Network插件:实现容器网络配置

三、Containerd环境部署

1. 安装Containerd(CentOS示例)
# 步骤1:添加Docker CE软件源(使用阿里云镜像加速)
curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 修改软件源配置,适配CentOS 8+环境
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

# 步骤2:列出可用的Containerd版本
yum list containerd.io --showduplicates

# 步骤3:安装Containerd(默认安装最新稳定版)
yum -y install containerd.io

解释

  • 通过curl获取Docker CE官方源并替换为阿里云镜像,加速下载
  • sed命令修改repo文件中的版本变量,适配CentOS系统
  • yum安装命令自动解决依赖,安装Containerd运行时
2. 生成与配置Containerd默认文件
# 生成默认配置文件
mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml

# 配置镜像加速(以Docker Hub和K8s镜像为例)
vim /etc/containerd/config.toml
# 在配置文件中找到[plugins."io.containerd.grpc.v1.cri".registry]部分,添加以下内容:
[plugins."io.containerd.grpc.v1.cri".registry]
config_path = "/etc/containerd/certs.d"  # 证书配置路径

# 创建镜像加速配置目录
mkdir -p /etc/containerd/certs.d/docker.io
mkdir -p /etc/containerd/certs.d/registry.k8s.io

# 配置Docker Hub镜像加速(使用DaoCloud镜像服务)
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

# 配置K8s镜像加速(使用阿里云镜像服务)
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

# 重启Containerd服务
systemctl restart containerd
systemctl status containerd

# 验证安装版本
ctr version

解释

  • ​containerd config default​​生成默认配置文件,包含存储、运行时等基础配置
  • 镜像加速配置通过​​hosts.toml​​​文件指定镜像仓库的代理地址,​​capabilities​​指定支持的操作(拉取、解析)
  • ​override_path = true​​用于覆盖镜像路径,将K8s官方镜像映射到阿里云镜像地址

四、Containerd核心操作

1. 镜像管理操作
# 全平台拉取Nginx镜像(包含所有架构版本)
ctr images pull docker.io/library/nginx:latest --all-platforms --hosts-dir=/etc/containerd/certs.d/

# 指定平台拉取(如Linux/AMD64)
ctr images pull docker.io/library/nginx:latest --platform linux/amd64 --hosts-dir=/etc/containerd/certs.d/

# 查看本地镜像(默认在default命名空间)
ctr images ls

# 查看指定命名空间镜像(如K8s.io)
ctr -n k8s.io images ls

# 检测镜像完整性(STATUS为complete表示可用)
ctr images check

# 重新打标签(方便本地管理)
ctr images tag docker.io/library/nginx:latest nginx:v1

# 删除镜像
ctr images rm nginx:v1

# 镜像挂载到主机目录(用于查看镜像文件系统)
ctr images mount nginx:v1 /mnt

# 卸载镜像挂载
ctr images unmount /mnt

# 全平台导出镜像为tar包
ctr images export --all-platforms nginx_latest.tar docker.io/library/nginx:latest

# 指定平台导入镜像
ctr images import --platform linux/amd64 nginx_latest.tar

关键参数说明

  • ​--all-platforms​​:拉取所有架构的镜像版本
  • ​--platform​​:指定目标架构(如linux/amd64)
  • ​--hosts-dir​​:指定镜像仓库配置目录,使用已配置的加速地址
  • ​mount​​操作可用于查看镜像内部文件结构,便于调试
2. 容器与任务管理
# 创建容器(基于Nginx镜像,容器名为nginx)
ctr containers create nginx:v1 nginx

# 列出容器
ctr containers ls

# 查看容器详细信息
ctr containers info nginx

# 删除容器(需先停止任务)
ctr containers rm nginx

# 启动容器任务(-d表示后台运行)
ctr task start -d nginx

# 查看运行中的任务
ctr task ls

# 进入容器(需指定exec-id,可自定义)
ctr task exec --exec-id 0 -t nginx sh

# 暂停容器
ctr task pause nginx

# 恢复容器
ctr task resume nginx

# 杀死容器任务
ctr task kill nginx

# 删除任务
ctr task rm nginx

# 获取容器资源使用 metrics
ctr task metrics nginx

# 查看容器内进程在宿主机的PID
ctr task ps nginx

注意事项

  • Containerd中​​container​​​与​​task​​​是分离概念:​​container​​​是配置实体,​​task​​是运行中的进程组
  • 端口映射需通过上层编排工具(如Kubernetes)实现,Containerd本身不支持
  • ​metrics​​命令可获取容器内存、CPU、进程数等资源使用情况
3. 插件与命名空间管理
# 列出所有插件及状态
ctr plugins ls

# 创建命名空间(用于资源隔离)
ctr ns create test

# 查看命名空间列表
ctr ns ls

# 删除命名空间
ctr ns rm test

# 在指定命名空间操作(如拉取镜像)
ctr -n test images pull docker.io/library/nginx:latest --platform linux/amd64 --hosts-dir=/etc/containerd/certs.d/

命名空间作用

  • 实现资源隔离,不同命名空间的容器互不可见
  • 常用于多租户环境或不同业务线的资源隔离

五、Containerd与Kubernetes的集成

作为Kubernetes默认运行时,Containerd通过CRI(Container Runtime Interface)接口与Kubernetes集成。在Kubernetes集群中,只需在节点配置中指定使用Containerd作为运行时,即可无缝对接。

# kubelet配置示例(/etc/kubernetes/kubelet.conf)
apiVersion: kubelet.config.k8s.io/v1
kind: KubeletConfiguration
containerRuntime: containerd
containerRuntimeEndpoint: unix:///run/containerd/containerd.sock

通过这种集成,Kubernetes可直接利用Containerd的镜像管理、容器生命周期管理等能力,实现大规模容器集群的调度与管理。

总结

Containerd以其轻量级、标准化和可扩展的特性,成为云原生容器技术的核心基础设施。从Docker架构拆分到CNCF孵化项目,它的发展始终围绕"标准化容器运行时"的目标,为Kubernetes等编排系统提供了稳定可靠的底层支持。

掌握Containerd的核心概念、架构设计、部署方法及日常操作,为深入理解云原生容器技术栈奠定基础。在微服务和容器化普及的今天,熟练运用Containerd将成为云原生工程师的必备技能。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐