公司动态
Docker、containerd、runc区别与联系
Docker、containerd 和 runc 是容器生态系统中三个不同层级的组件它们共同协作以完成容器的创建、运行和管理。理解它们的区别与联系关键在于区分高层管理、底层调度和核心执行这三个角色。1. 核心定义与角色定位runc (Low-Level Runtime)定义runc 是一个轻量级的命令行工具用于根据 OCI开放容器计划标准运行容器。它是容器运行的“最终执行者”。角色低级容器运行时。它直接调用 Linux 内核特性如 namespaces、cgroups、SELinux等来隔离进程创建真正的容器环境。特点功能单一只负责“跑”容器不负责镜像下载、网络配置或日志管理。它是 OCI 容器运行时标准的参考实现 any OCI-compliant runtime can replace it (e.g., Kata Containers, gVisor).containerd (High-Level Runtime / Daemon)定义containerd 是一个工业级的容器守护进程旨在管理容器的完整生命周期。 it was extracted from Docker to be a standalone, embeddable container runtime.角色高级容器运行时/容器管理器。它负责镜像管理拉取、解压、容器执行调用 runc、网络插件集成、存储卷管理等。特点不直接面向最终用户没有复杂的 CLI 交互逻辑而是作为基础设施供上层平台如 Kubernetes、Docker Engine调用。它提供了稳定的 API 供其他软件集成。Docker (Docker Engine / Platform)定义Docker 通常指 Docker Engine是一个完整的容器化平台包含客户端CLI、守护进程dockerd以及一系列周边工具。角色用户交互界面与全能管理平台。它为用户提供友好的命令行接口docker run, docker build 等处理构建镜像、编排多容器应用Compose、管理网络和安全策略等高阶任务。特点面向开发者和运维人员封装了底层复杂性。在架构上Docker Engine 依赖 containerd 来管理容器而 containerd 又依赖 runc 来实际运行容器。2. 三者之间的关系与协作流程可以将它们的关系比喻为一家餐厅的运作Docker 是前台经理和服务员接收顾客用户的点单命令处理菜单镜像构建协调资源并告诉厨房做什么。containerd 是厨房主管接收经理的指令准备食材拉取和解压镜像安排灶台分配资源并指挥厨师开始做菜。runc 是厨师真正动手炒菜利用内核特性隔离并运行进程把生食材变成做好的菜运行中的容器。技术协作流程如下用户输入 docker run nginx。Docker Daemon (dockerd) 解析命令检查本地是否有 nginx 镜像。如果没有它请求 containerd 从注册表拉取镜像。containerd 下载镜像将其解压为标准化的 OCI 包bundle并生成符合 OCI 规范的配置文件config.json。containerd 调用 runc传入该 bundle 路径。runc 读取配置利用 Linux 内核功能创建命名空间和 cgroup启动容器进程。容器运行后runc 退出将控制权交还给 containerd 进行状态监控Docker 则向用户返回容器 ID 和状态。3.总结runc 是真正干活的“引擎”负责利用 Linux 内核特性运行容器。containerd 是“传动系统”管理镜像、调度 runc 并提供标准 API是 Kubernetes 和 Docker 的共同基石。Docker 是“整车”提供了方向盘、仪表盘和舒适的座椅CLI、Build、Compose 等让用户能轻松驾驶容器技术。在现代云原生架构中尤其是 Kubernetes 环境下趋势是逐渐淡化 Docker Engine 的存在直接使用 containerd runc 的组合以获得更轻量、更标准的容器运行时体验。