当前位置: 首页 > web >正文

【笔记】cri-docker.service和containerd

cri-docker.servicecontainerd 都是 Kubernetes 支持的容器运行时组件,但它们的架构、功能定位及与 Docker 的关系有显著差异。以下是它们的核心区别和关联:


1. 功能定位

组件核心角色是否直接支持 CRI
containerd轻量级容器运行时,直接管理容器的生命周期(创建、启动、停止等),是 Docker 的底层引擎。是(内置 CRI 插件)
cri-docker.service适配器服务,将 Kubernetes 的 CRI 请求转换为 Docker API,使 Kubelet 能通过 Docker 管理容器。否(需转换协议)

2. 架构差异

containerd 的架构
CRI
OCI
Kubelet
containerd
runc
容器进程
  • 直接路径
    Kubelet 通过 CRI 直接调用 containerdcontainerd 使用 runc 创建容器。
    无 Docker 参与,性能更高,路径更短。
cri-docker.service 的架构
CRI
Docker API
containerd
Kubelet
cri-docker
dockerd
runc
容器进程
  • 间接路径
    Kubelet 的 CRI 请求需经 cri-docker 转换为 Docker API,再由 dockerd 调用 containerd
    多一层转换,依赖 Docker 的完整堆栈。

3. 与 Docker 的关系

组件是否依赖 Docker能否脱离 Docker 独立运行
containerd是(Docker 底层使用它,但可独立运行)
cri-docker.service否(必须安装 Docker)
  • 关键区别
    • containerd 是 Docker 的底层组件,但完全独立,可直接被 Kubernetes 使用。
    • cri-docker.service 是 Docker 的“兼容层”,目的是让 Kubernetes 继续调用 Docker。

4. 性能与复杂度

维度containerdcri-docker.service
性能更高(直接 CRI 调用,无额外转换)较低(CRI → Docker API → containerd)
组件复杂度轻量(仅核心运行时功能)较重(依赖 Docker 完整堆栈)
调试难度简单(日志和路径清晰)复杂(需排查多层级调用)

5. 使用场景对比

场景推荐方案原因
生产环境(Kubernetes ≥1.24)containerdCRI-O原生支持 CRI,性能优,维护成本低。
开发/测试环境(依赖 Docker)cri-docker.service兼容现有 Docker 工具链(如 docker builddocker logs)。
从 Docker 迁移到原生 CRI过渡期使用 cri-docker逐步迁移业务到 containerd,避免一次性改动。

6. 如何选择?

  • 优先 containerd
    如果不需要 Docker 特定功能(如 docker compose),直接使用 containerd 是 Kubernetes 的推荐方案。
  • 不得已用 cri-docker
    仅当强依赖 Docker 生态时使用(例如某些 CI/CD 工具链)。

7. 命令示例:查看运行时

检查当前运行时
# 查看 containerd 是否运行
systemctl status containerd# 查看 cri-docker 是否运行
systemctl status cri-docker
查看 Kubelet 使用的运行时
ps -ef | grep kubelet | grep -- --container-runtime
# 输出示例:
# --container-runtime=remote --container-runtime-endpoint=unix:///var/run/containerd/containerd.sock
# 或
# --container-runtime-endpoint=unix:///var/run/cri-dockerd.sock

总结

  • containerd
    Kubernetes 生产级运行时,直接、高效,是 Docker 的底层但可独立运行。
  • cri-docker.service
    为兼容 Docker 存在的过渡方案,通过协议转换实现 CRI 支持,性能较低但保留 Docker 工具链。
  • 关系
    cri-docker 依赖 Docker,而 Docker 依赖 containerd;若无需 Docker,应直接使用 containerd
http://www.xdnf.cn/news/6625.html

相关文章:

  • 特斯拉虚拟电厂:能源互联网时代的分布式革命
  • [IMX] 01.IVT 表长度计算
  • 考研408《计算机组成原理》复习笔记,第二章(2)数值数据的表示(浮点数篇)
  • 【springboot项目服务假死、内存溢出问题排查】
  • shell-awk
  • TVS管用万用表测量方法详解(含二极管档使用指南)
  • 【微信小程序】webp资源上传失败
  • 告别碎片化!MCP 带来 AI Agent 开发生态的革命性突破
  • Qt之QMessageBox
  • 【RabbitMQ】实现RPC通信的完整指南
  • 浅谈算法中的贪心策略:从直觉到策略的思维跨越
  • ios打包ipa获取证书和打包创建经验分享
  • (独家)SAP CO模块中 销售发票对应的Cost Document中的PSG对象是什么东东??
  • leetcode0621. 任务调度器-medium
  • 论QT6多线程技术
  • linux-配置定时任务
  • 一道canvas算法题(看过记录下)
  • js在浏览器执行原理
  • 【Linux】Linux安装并配置mysql
  • vue基本介绍
  • H.264/AVC 变换量化编码核心技术拆解
  • C#语言中 (元,组) 的发展史
  • Unity基础学习(十五)核心系统——音效系统
  • PC:使用WinSCP密钥文件连接sftp服务器
  • c++作业整理2
  • 纯前端实现基于位置的天气和动态背景图片
  • 行为型模式:责任链模式
  • 代码随想录 算法训练 Day2:数组
  • 第七节第三部分:从JDK8开始接口新增的方法、接口的多继承、注意事项
  • 一.android Studio开发系统应用——导入TvSettings源码