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这些概念的区别!
如果还不清楚,可以再回过头来看看上面的那张图。
标签:容器,Kubernetes,containerd,runc,Docker,CRI,运行 From: https://www.cnblogs.com/chuanzhang053/p/16784668.html