一、什么是 CRI¶
CRI 是 Container Runtime Interface 的缩写,也就是 Kubernetes 的容器运行时接口。
它的本质作用是定义 Kubernetes 与底层容器运行时之间的标准通信方式,让 kubelet 不需要为每一种运行时单独适配逻辑,就能统一对接不同的容器运行时实现,例如:
- Containerd
- CRI-O
- Kata Containers
因此,CRI 的价值不在于“它能直接跑容器”,而在于它让 Kubernetes 获得了对多种运行时的统一支持能力。
二、CRI 在 Kubernetes 中是怎么工作的¶
如果把一个 Pod 从创建到销毁的过程拆开,CRI 主要参与下面这些环节:
- kubelet 接收创建 Pod 的请求
- 通过 CRI 调用底层运行时准备 Pod 沙箱
- 拉取所需镜像到本地
- 创建并启动容器
- 持续检查容器运行状态
- Pod 删除时,按顺序停止容器并清理资源
也就是说,CRI 主要作用在 kubelet 和实际运行时之间,负责把 Kubernetes 的意图翻译成底层运行时能理解和执行的动作。
三、什么是 Containerd¶
Containerd 是一个开源容器运行时,负责管理容器生命周期中最核心的一系列能力,包括:
- 镜像传输与存储
- 容器创建、启动、停止和删除
- 容器监控
- 底层存储和部分网络相关管理
它最初来自 Docker 体系,在 2016 年从 Docker Engine 中逐渐剥离,后续捐赠给 CNCF,并成长为云原生体系中的核心运行时项目之一。
今天在 Kubernetes 环境里,Containerd 已经是最主流的容器运行时之一。
四、Containerd 和 Docker 到底是什么关系¶
这是很多人最容易混淆的点。
可以直接记住一句话:
- Docker 包含 Containerd
- 但 Containerd 并不依赖 Docker 才能工作
Docker 更像是一整套完整的容器平台,除了运行容器,还负责:
- 镜像构建
- CLI 交互
- 网络管理
- 存储管理
- 开发者友好的工具链体验
而 Containerd 更聚焦于运行时层本身,重点是容器生命周期和镜像管理。

五、Docker 和 Containerd 的调用链怎么理解¶
理解这条调用链,是学习运行时最重要的一步。

它大致可以分成下面几层:
5.1 用户交互层:Docker CLI¶
用户通过 docker run、docker build 这类命令与 Docker 交互。
5.2 核心引擎层:Docker Engine¶
Docker Engine 接收 CLI 请求,解析命令,并协调镜像、网络、存储和容器生命周期相关动作。
5.3 容器运行时层:Containerd¶
Containerd 负责真正意义上的运行时管理,例如:
- 拉取和存储镜像
- 管理容器创建与删除
- 跟踪容器运行状态
5.4 容器执行层:runc¶
runc 是基于 OCI 标准的具体实现,用于真正创建和运行容器进程。
它会负责:
- 创建命名空间
- 配置 cgroups
- 启动容器入口进程
5.5 容器实例层:Container¶
最终运行起来的进程,就是我们看到的容器实例。
六、把整条运行时链路串起来看¶
如果把一条常见命令 docker run -d nginx 拆开,内部大概会发生这些事情:
- 用户通过 CLI 发起命令
- Docker Engine 接收并解析请求
- 如果本地没有镜像,则先从远程仓库拉取镜像
- Docker Engine 调用 Containerd 创建容器
- Containerd 生成 OCI 配置并调用 runc
- runc 创建容器进程并启动主程序
- Containerd 持续管理和监控容器状态
这也是为什么说:Docker 是完整平台,Containerd 是核心运行时组件,runc 是最终执行器。
七、Containerd 常见客户端工具有哪些¶
Day006 里提到了三种最常见的客户端工具:
ctrnerdctlcrictl
它们分别适合不同场景:
7.1 ctr¶
适合底层调试、镜像导入导出、命名空间管理这类更接近 Containerd 内部能力的操作。
优点是功能全面、直接对接 Containerd;缺点是命令风格不如 Docker 友好。
7.2 nerdctl¶
适合日常容器管理和替代 Docker CLI 使用。
它最大的优势是命令风格与 Docker 非常接近,因此对多数工程师更友好。
7.3 crictl¶
更适合 Kubernetes 集群调试,重点是围绕 CRI 能力进行排障和状态查看。
八、学习 Containerd 时最该先建立的三个认知¶
如果把本篇内容浓缩成最重要的三点,其实就是:
- CRI 是 Kubernetes 和运行时之间的标准接口
- Containerd 是主流容器运行时,不等于 Docker,但最初来自 Docker 体系
- Docker、Containerd、runc 之间是分层协作关系,不是互相替代关系
把这三点真正吃透,后面再学习 ctr、nerdctl、镜像仓库配置和 Kubernetes 运行时排障时,理解会轻松很多。