Docker, containerd, CRI-O and runc之间的区别?
1、概述
在容器生态系统中充斥着各种各样的术语,今天就来为你,一一解码!
Docker开启了容器的时代,但不久之后,工具、标准和首字母缩略词似乎在这一领域爆发。那么,“docker”到底是什么,“CRI”和“OCI”这些术语又是什么意思呢?你为什么要在乎呢?继续往下读,找出答案。
2、关于Docker
Docker公司、Docker容器、Docker镜像和我们都习惯使用的Docker开发者工具之间是有区别的。
容器不再与Docker这个名字紧密耦合。
你可以用Docker运行容器,或者其他一些不是Docker的工具。docker只是众多选择中的一个,docker(该公司)支持生态系统中的一些工具,但不是全部。
因此,如果您认为容器只就是Docker,那么请继续阅读!我们将研究容器周围的生态系统以及每个部分的作用。如果你正在考虑转入DevOps,这一点尤其有用。
3、容器生态系统
容器生态系统是由大量令人兴奋的技术、大量的术语和相互争斗的大公司组成的。
幸运的是,这些公司偶尔会在一个脆弱的休战中走到一起,同意一些标准。标准有助于使生态系统更具互操作性,因此您可以在不同的平台和操作系统上运行软件,并减少对单个公司或项目的依赖。
关于容器,你应该知道的主要标准(尽管你不需要知道所有的细节)是:
- Open Container Initiative (OCI) ,定义容器和镜像的标准
- Container Runtime Interface (CRI),它定义了Kubernetes和下面的容器运行时之间的API。
4、Docker,k8s,CRI,OCI,containerd和runc之间是如何紧密合作的?
下面的这张图,就展示了k8s,docer,cri,oci,containerd和runc之间是如何相互协作的
5、Docker中是如何运行容器的?
下面的这张图,就是在docker中运行容器的整个过程和涉及的组件
- docker:命令行工具,终端用户使用这个命令来和docker进行交互
- containerd,containerd是一个进程,用来拉取、推送镜像,管理网络,存储,然后使用runc来运行容器,并且管理容器的运行
- runc:这是底层容器运行时,或者实际创建和运行容器的东西)。它包括libcontainer,这是一个基于go的本地实现,用于创建容器
实际上,当你用docker命令运行一个容器时,你实际上是通过docker守护进程运行它,它调用containerd,然后使用runc
6、Dockershim:在k8s中的docker
那么Docker和Kubernetes有什么关系呢?
Kubernetes包含一个名为dockershim的组件,该组件允许它与Docker一起运行容器。
但实际上,Kubernetes更喜欢通过任何支持其容器运行时接口(CRI)的容器运行时运行容器。
Docker比Kubernetes更古老,没有实现CRI。这就是dockershim存在的原因,基本上把Docker连接到Kubernetes上。或者是Kubernetes到Docker上,不管你喜欢怎么想。
什么是shim?
在技术术语中,shim是软件系统中的一个组件,充当不同api之间的桥梁,或作为兼容层。当您想使用第三方组件时,有时会添加shim,但您需要一些粘合代码来使其工作。
未来,Kubernetes将直接删除对Docker的支持,并倾向于只使用实现其容器运行时接口的容器运行时。这可能意味着使用containerd或crio。
但这并不意味着Kubernetes不能运行docker格式的容器。containerd和CRI-O都可以运行docker格式(实际上是oci格式)的镜像;他们不需要使用docker命令或docker守护进程就能完成。
7、Docker镜像?
许多人所说的Docker镜像实际上是(OCI)格式打包的镜像。
因此,如果您从Docker Hub或其镜像仓库拉取镜像,您应该能够将它与Docker命令、Kubernetes集群、podman实用程序或任何支持OCI镜像格式规范的其他工具一起使用。
这就是拥有一个开放标准的好处——任何人都可以编写支持该标准的软件。
8、Container Runtime Interface (CRI)
CRI是Kubernetes用来控制创建和管理容器的不同运行时的协议。
CRI是您可能希望使用的任何类型的容器运行时的抽象。因此,CRI使Kubernetes更容易使用不同的容器运行时。
与Kubernetes项目需要手动添加对每个运行时的支持不同,CRI API描述了Kubernetes如何与每个运行时交互。因此,实际管理容器的任务就交给运行时了。只要它遵守CRI API,它就可以做任何它想做的事情。
因此,如果您更喜欢使用containerd来运行您的容器,您可以这样做。或者,如果您更喜欢使用CRI-O,那么您可以这样做。这是因为这两个运行时都实现了CRI规范。
如果您是终端用户(比如开发人员),那么实现基本上不重要。不同的CRI实现之间有细微的差别,但它们都是可插入和无缝更改的。
如果你花钱从供应商那里获得支持(安全性、bug修复等),那么你对运行时的选择可能很重要。例如,红帽的OpenShift使用了crI-o,并提供了对它的支持。Docker为自己的containerd提供支持。
如何在Kubernetes中检查容器运行时?
在Kubernetes体系结构中,kubelet(运行在每个节点上的代理)负责向容器运行时发送启动和运行容器的指令。
您可以通过查看每个节点上的kubelet参数来检查正在使用哪个容器运行时。有一个选项——container-runtime和——container-runtime-endpoint用于配置要使用的运行时。
9、containerd
containerd是一个来自Docker的高级容器运行时,实现了CRI规范。它从镜像仓库中拉取镜像,管理它们,然后移交给低级运行时,后者实际创建并运行容器进程。
containerd从Docker项目中分离出来,使Docker更加模块化
Docker在内部使用containerd。当你安装Docker时,它也会安装containerd。
containerd通过其CRI插件实现了Kubernetes容器运行时接口(CRI)。
10、CRI-O
CRI- O是实现容器运行时接口(CRI)的另一种高级容器运行时。
它是容器的另一种选择。它从仓库拉取容器镜像,在磁盘上管理它们,并启动较低级的运行时来运行容器进程。
是的,CRI-O是另一个容器运行时。它诞生于红帽、IBM、英特尔、SUSE和其他公司。
它是专门为Kubernetes创建的一个容器运行时。它提供了启动、停止和重新启动容器的能力,就像containerd一样。
11、Open Container Initiative (OCI)
OCI是一组技术公司,他们维护容器镜像格式的规范,以及容器应该如何运行。
OCI背后的思想是,您可以选择符合规范的不同运行时。每个运行时都有不同的底层实现。
例如,您的Linux主机可能有一个与oci兼容的运行时,Windows主机可能有一个。
这就是拥有一个可以由许多不同项目实现的标准的好处。从蓝牙设备到Java api,这种“一个标准,多种实现”的方法到处都在使用。
12、runc
runc是一个兼容oci的容器运行时。它实现OCI规范并运行容器进程。
runc被称为OCI的参考实现。
runc提供容器的所有底层功能,与现有的底层Linux特性(如名称空间和控制组)交互。它使用这些特性来创建和运行容器进程。
runc的替代方案是:
- crun
- kata-runtime
- gvisor
OK,以上就是关于容器、docker,k8s,runc,CRI,OCI,containerd,CRI-O这些概念的区别!
如果还不清楚,可以再回过头来看看上面的那张图。
----
你好,
如果你的大部分工作是围绕k8s展开的,那么下面的内容对你来说非常的重要...
过去4年多的时间里,我的工作都是围绕k8s体系的搭建及运维展开的,结合项目(14个1500万以上的云原生项目)实践,
我整理了230个,k8s最常见(最关键、最重要)的问题。
当你彻底搞懂、掌握这些问题后,让几乎可以轻松解决k8s的所有问题。
同时,你的知识体系,k8s基本功,就可以轻松超过80%的k8s运维人员。
更重要的是,可以让你轻松进入大厂(因为我就是在大厂,我知道大厂更关注哪部分知识),拿到更加高的工资。
需要告诉你的是,掌握这些知识非常的简单,针对每个问题,我都给出项目的背景,关键知识点,问题的解决思路,最终效果和调整方案。
如果能够熟读这些项目情况、背景,架构设计,这些也可变成你自己的项目经历,轻松让你的领导和未来面试官惊喜和意外。
你只需每天拿出1个小时,2个月后,你就可以打下k8s的坚实的基本功,让你在云原生领域游刃有余,k8s的功力快速飞跃。
每个问题,都有对应的答案,以及相关的示例演示(有些还有项目背景说明)
只要,一步一步,跟着做,就可以了。
当然,如果你想要在更短的时间内,成为k8s高手,你只需要多练习几次,多在你的本地环境进行几次实验就可以了。
不过,和你自己从头摸索、研究相比,大大减少了你的学习时间,也大大提升了你的学习效力。
如果你知道20/80原理,你就会明白,这些都是工作中最常用,最有效的20%的问题(需要大量实践、总结之后,才能明白的20%)。
这个资料是第一次公开,为了了解市场上,有多少人在关注k8s的技术,我决定免费赠送这个问题指南,只当交个朋友。
添加微信:13240133388,备注:k8s。
我将送你一份免费的PDF报告。
你应该知道,一本k8s权威指南(800页,没几个人看得完),要179.90元,这些问题,是在反复阅读和实践了这本书之后,结合项目实践,得出来的精华。
想想看,这将节省你多少时间?而你得到是最精华的部分
相信你,掌握之后,立马让你的工作的效率大增,你的领导会对你的进步刮目相看,你会对未来的跳槽、涨薪更有信心。
想想看,当你拥有这本报告后,你就好像拿着一本武功秘籍,在技术的红海中,笑看风云,鹤立鸡群。
也像一位武林大师,一掌下去,几年的功力,瞬间就转移到了你的身上。
感觉怎么样?
PS. 行动是一切的开始,现在立马加我吧。期待你的蜕变。
---------------
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤
2020-10-12 大明的FAQ
2018-10-12 linux环境中通过useradd命令,创建用户的时候指定用户的base-dir