zl程序教程

您现在的位置是:首页 >  工具

当前栏目

Docker, containerd, CRI-O and runc之间的区别?

Docker 区别 and 之间 containerd
2023-09-11 14:14:16 时间

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的支持,并倾向于只使用实现其容器运行时接口的容器运行时。这可能意味着使用containerdcrio

 

但这并不意味着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这些概念的区别!

 

如果还不清楚,可以再回过头来看看上面的那张图。