cri,containerd,runc之间的关系?执行 docker run xxx 命令底层经过哪些步骤,越详细越好。

在容器技术中,CRI、containerd 和 runc 是 Kubernetes 和 Docker 等容器平台中关键的组件,它们在容器生命周期管理中扮演着重要角色。理解它们之间的关系有助于理解容器运行的整个过程。下面将详细描述它们的关系及执行 docker run xxx 命令时底层的工作流程。

1. CRI、containerd、runc 之间的关系

  • CRI(Container Runtime Interface):
    • CRI 是 Kubernetes 定义的一套标准接口,用于与容器运行时交互。Kubernetes 通过 CRI 与底层容器运行时进行通信。
    • 常见的 CRI 实现有 containerd 和 CRI-O。
  • containerd:
    • containerd 是一个高性能的容器运行时,它负责管理容器的生命周期,包括镜像管理、容器创建、启动、停止、删除等。最初,containerd 是 Docker 的核心组件,后来被 CNCF 接管并发展成独立项目。
    • 在 Kubernetes 中,containerd 是直接与 CRI 对接的容器运行时,因此 Kubernetes 可以通过 CRI 与 containerd 进行交互。
  • runc:
    • runc 是一个命令行工具,负责使用 Linux 内核的 cgroups 和 namespace 特性来创建和运行容器。它是基于 OCI(Open Container Initiative)标准的容器运行时。
    • runc 是更底层的工具,它被 containerd 调用来实际创建和启动容器。

2. 执行 docker run xxx 命令时底层经过的步骤

当你运行 docker run xxx 命令时,底层会经历一系列步骤来创建和启动容器。以下是详细流程:

1. Docker CLI 接收命令
  • 用户在命令行运行 docker run xxx。
  • Docker CLI 解析命令参数,生成一个 HTTP 请求,并将请求发送给 Docker Daemon。
2. Docker Daemon 处理请求
  • Docker Daemon 是一个长期运行的后台服务,负责处理来自 Docker CLI 的请求。
  • Docker Daemon 接收到请求后,会根据命令(如拉取镜像、创建容器)进行相应的处理。
3. 与 containerd 交互
  • Docker Daemon 不直接管理容器的生命周期,而是将这个任务交给 containerd。
  • Docker Daemon 通过 containerd 的 gRPC API 发送创建容器的请求。
4. containerd 创建和管理容器
  • containerd 接收 Docker Daemon 的请求后,开始处理容器的生命周期管理。
  • 具体流程包括:拉取镜像、解压镜像、准备容器文件系统、设置网络、配置容器的资源限制等。
5. 调用 runc 创建和运行容器
  • 当 containerd 准备好容器的环境后,它会调用 runc。
  • runc 负责使用 Linux 的 cgroups 和 namespace 技术来隔离和运行容器。它根据 OCI 配置规范创建容器。
  • 具体步骤包括:为容器创建独立的进程空间、挂载容器文件系统、设置网络命名空间、启动容器进程等。
6. 容器启动并运行
  • 容器启动后,containerd 会监控容器的运行状态,并向 Docker Daemon 返回状态信息。
  • 最终,Docker Daemon 将运行结果返回给 Docker CLI,CLI 将结果显示给用户。

3. 组件之间的详细交互流程

  • 用户请求 (docker run)Docker CLI 发送请求Docker Daemon 解析和转发请求containerd 创建容器环境runc 实际启动容器containerd 监控容器Docker Daemon 返回结果用户看到输出

4. Kubernetes 中的容器启动流程(补充)

在 Kubernetes 中,容器启动流程与 Docker 类似,但主要通过 CRI 与 containerd 交互:

  • Kubelet 通过 CRI 调用 containerdcontainerd 创建和管理容器containerd 调用 runc 启动容器

5. 总结

  • CRI 是 Kubernetes 与底层容器运行时交互的接口。
  • containerd 是容器的主要管理器,负责处理容器生命周期。
  • runc 是实际负责使用操作系统机制(如 namespace 和 cgroups)创建和运行容器的工具。

执行 docker run 命令时,CLI 将请求传递给 Docker Daemon,Docker Daemon 调用 containerd 进行容器的管理,最终通过 runc 启动容器。这一流程体现了容器化技术中从用户请求到容器启动的整个过程。

🔥运维干货分享

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

企鹅侠客

您的打赏是我创作旅程中的关键燃

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值