• Docker, containerd, CRIO 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的支持,并倾向于只使用实现其容器运行时接口的容器运行时。这可能意味着使用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这些概念的区别!

     

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

  • 相关阅读:
    .NET6之MiniAPI(三):Response
    .NET6之MiniAPI(二):request
    .NET6之MiniAPI(一):开始Mini API
    Windows Server 2019+.Net Core项目+IIS部署
    Winform GDI 绘制抛物线
    关闭win10防火墙
    查询sql数据表的数据量
    获取Spring中@PathVariable注解里带点的完整参数
    Android Studio 新建真正的Java项目(原创)
    Typora 最后的免费版Version 0.11.18 下载地址 [转]
  • 原文地址:https://www.cnblogs.com/chuanzhang053/p/16784668.html
Copyright © 2020-2023  润新知