一文搞懂Docker、RunC、Containerd之间的关系

本文探讨了Containerd作为容器运行时的核心地位,以及与RunC(如go实现的runc)和Docker-shim之间的区别。重点讲述了OCI规范和CRI接口在Kubernetes中的应用,以及Docker在K8s中的演变和淘汰过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Containerd:Containerd 是容器运行时,从容器编排角度,Containerd 是容器运行时。

RunC:RunC 是容器运行工具,纯从系统角度,Runc才是底层运行时 。

Docker:我们常说的 docker 一般指的是 docker-shim,其也是一种容器运行时。

实际上不存在容器这个概念。 虚拟机是有的,当我们使用Linux内核技术实现了隔离,外加一些网络配置来实现互通。---- 我们把这个现象叫做容器。

能完成上述现象的 工具 叫做 运行时 ---runC (go写的)就是。 还有crun(c写的)  yuki(rust写的)都是。

但是光有容器还不够, 还需要镜像管理、网络配置、容器的启停这些,于是 Containerd、cri-o 这些 就是来干这种事的。

并且对于创建容器和镜像管理,包括分发(DockerHub),出现了OCI 规范 ,包括了容器规范、镜像规范和分发规范。

作为上游的容器编排工具,K8S 不可能直接调用 RunC,只能去调用 Containerd、cri-o。于是通过grpc调用的方式,并规定了 grpc 的接口方法和字段,各个厂商必须实现,也就是我们所谓的CRI(Container Runtime Interface)。

早期Docker比较火的时候,K8S不得不通过 docker-shim 来转换CRI方法。由于一些原因,K8S在1.19 版本提出要干掉 Docker,1.24版本已经正式废弃。但是实际上,Contaienrd 本身就是 Docker 分离出来的。至于 runC,本身也是 Docker 捐赠给 OCI 作为 OCI 容器运行时标准的参考实现。

实际的调用链路是:

K8S -> kubelet -> grpc call -> Containerd-> runC

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

常鱼

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值