一、什么是 CRI

CRI 是 Container Runtime Interface 的缩写,也就是 Kubernetes 的容器运行时接口。

它的本质作用是定义 Kubernetes 与底层容器运行时之间的标准通信方式,让 kubelet 不需要为每一种运行时单独适配逻辑,就能统一对接不同的容器运行时实现,例如:

  • Containerd
  • CRI-O
  • Kata Containers

因此,CRI 的价值不在于“它能直接跑容器”,而在于它让 Kubernetes 获得了对多种运行时的统一支持能力。

二、CRI 在 Kubernetes 中是怎么工作的

如果把一个 Pod 从创建到销毁的过程拆开,CRI 主要参与下面这些环节:

  1. kubelet 接收创建 Pod 的请求
  2. 通过 CRI 调用底层运行时准备 Pod 沙箱
  3. 拉取所需镜像到本地
  4. 创建并启动容器
  5. 持续检查容器运行状态
  6. Pod 删除时,按顺序停止容器并清理资源

也就是说,CRI 主要作用在 kubelet 和实际运行时之间,负责把 Kubernetes 的意图翻译成底层运行时能理解和执行的动作。

三、什么是 Containerd

Containerd 是一个开源容器运行时,负责管理容器生命周期中最核心的一系列能力,包括:

  • 镜像传输与存储
  • 容器创建、启动、停止和删除
  • 容器监控
  • 底层存储和部分网络相关管理

它最初来自 Docker 体系,在 2016 年从 Docker Engine 中逐渐剥离,后续捐赠给 CNCF,并成长为云原生体系中的核心运行时项目之一。

今天在 Kubernetes 环境里,Containerd 已经是最主流的容器运行时之一。

四、Containerd 和 Docker 到底是什么关系

这是很多人最容易混淆的点。

可以直接记住一句话:

  • Docker 包含 Containerd
  • 但 Containerd 并不依赖 Docker 才能工作

Docker 更像是一整套完整的容器平台,除了运行容器,还负责:

  • 镜像构建
  • CLI 交互
  • 网络管理
  • 存储管理
  • 开发者友好的工具链体验

而 Containerd 更聚焦于运行时层本身,重点是容器生命周期和镜像管理。

Containerd 和 Docker 的关系

五、Docker 和 Containerd 的调用链怎么理解

理解这条调用链,是学习运行时最重要的一步。

Docker 与 Containerd 调用链

它大致可以分成下面几层:

5.1 用户交互层:Docker CLI

用户通过 docker rundocker 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 拆开,内部大概会发生这些事情:

  1. 用户通过 CLI 发起命令
  2. Docker Engine 接收并解析请求
  3. 如果本地没有镜像,则先从远程仓库拉取镜像
  4. Docker Engine 调用 Containerd 创建容器
  5. Containerd 生成 OCI 配置并调用 runc
  6. runc 创建容器进程并启动主程序
  7. Containerd 持续管理和监控容器状态

这也是为什么说:Docker 是完整平台,Containerd 是核心运行时组件,runc 是最终执行器

七、Containerd 常见客户端工具有哪些

Day006 里提到了三种最常见的客户端工具:

  • ctr
  • nerdctl
  • crictl

它们分别适合不同场景:

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 之间是分层协作关系,不是互相替代关系

把这三点真正吃透,后面再学习 ctrnerdctl、镜像仓库配置和 Kubernetes 运行时排障时,理解会轻松很多。