一文带你了解Docker与Containerd的区别

容器运行时容器运行时(ContAIner Runtime)是一种负责在操作系统层面创建和管理容器的软件工具或组件 。它是容器化技术的核心组件之一 , 用于在容器内部运行应用程序 , 并提供隔离、资源管理和安全等功能 。在Kube.NETes中 , 容器运行时是负责管理和运行容器的组件 。在过去 , Docker是最常用的容器运行时 , 但随着时间的推移 , containerd成为Kubernetes的另一个受欢迎的容器运行时选择 。

说明:自 kubernetes 1.24 版起 , Dockershim 已从 Kubernetes 项目中移除 。
容器运行时的主要任务包括:
  1. 容器创建和启动:容器运行时负责根据预定义的容器配置信息(如镜像、命令、环境变量等) , 创建并启动容器实例 。
  2. 容器文件系统管理:容器运行时处理容器的文件系统 , 负责将镜像的内容挂载到容器的文件系统 , 并在容器之间提供隔离 。
  3. 资源限制和管理:容器运行时可以根据用户或管理员定义的资源限制 , 管理容器对CPU、内存、磁盘等资源的使用 。
  4. 容器网络:容器运行时协助配置容器的网络 , 使得容器可以与其他容器或外部网络进行通信 。
  5. 安全性:容器运行时实施安全机制 , 确保容器之间和宿主机之间的隔离 , 并防止容器中的恶意行为影响其他容器或宿主机 。
在当今云原生技术的潮流中 , 容器化技术已经成为现代应用部署的主流选择 。Kubernetes (K8s) 作为一种流行的容器编排系统 , 广泛应用于大规模的容器集群管理 。而在K8s中 , 容器运行时的选择对于性能、可靠性和安全性都起着至关重要的作用 。本文将对比两种常见的K8s容器运行时:Containerd和Docker , 并探讨它们的异同点 。
Docker:原先的翘楚Docker作为一种早期的容器技术 , 它的出现颠覆了传统虚拟化方式 , 通过轻量级容器化的方式实现了应用的打包、交付和运行 。Docker在容器技术的普及过程中发挥了关键作用 , 其用户友好的命令行工具和图形化界面让容器技术对广大开发者变得更加友好和易用 。一度 , Docker几乎成为容器化的代名词 。然而 , 随着Kubernetes的兴起 , Docker在K8s中的地位逐渐受到挑战 。一方面 , Docker作为一个完整的容器平台 , 包含了许多K8s并不需要的功能 , 导致资源浪费 。另一方面 , K8s本身提供了容器编排和调度的功能 , 与Docker重叠 , 造成了一定程度上的冲突 。为了防止docker一家独大 , docker当年的实现被拆分出了几个标准化的模块 , 标准化的目的是模块是可被其他实现替换的 , 不由任何一个厂商控制 。Docker 由
  • docker-client
  • dockerd
  • containerd
  • docker-shim
  • runc
组成 , 所以containerd是docker的基础组件之一 , docker 对容器的管理和操作基本都是通过 containerd 完成的 。那么 , containerd 是什么呢?
Containerd:K8s生态系统的标配Containerd是由Docker团队开源的容器运行时 , 它专注于提供轻量级、高性能的容器运行环境 。作为一个纯粹的容器运行时 , Containerd被设计为更加符合K8s的架构和需求 。它具有更小的资源占用 , 更快的启动时间 , 以及更好的性能表现 。K8s社区认可了Containerd的优势 , 并将其作为K8s生态系统的标配容器运行时 。Containerd 可以在宿主机中管理完整的容器生命周期:容器镜像的传输和存储、容器的执行和管理、存储和网络等 。详细点说 , Containerd 负责干下面这些事情:
  • 管理容器的生命周期(从创建容器到销毁容器)
  • 拉取/推送容器镜像
  • 存储管理(管理镜像及容器数据的存储)
  • 调用 runC 运行容器(与 runC 等容器运行时交互)
  • 管理容器网络接口及网络
容器运行时接口(CRI)容器运行时接口(Container Runtime Interface) , 简称 CRI 。CRI 是一个插件接口 , 它使 kubelet 能够使用各种容器运行时 , 无需重新编译集群组件 。你需要在集群中的每个节点上都有一个可以正常工作的容器运行时 ,  这样 kubelet 能启动 Pod 及其容器 。容器运行时接口(CRI)是 kubelet 和容器运行时之间通信的主要协议 。


推荐阅读