首页 > 其他分享 >Docker, containerd, CRI-O and runc之间的区别?

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

时间:2022-10-12 15:34:43浏览次数:49  
标签:容器 Kubernetes containerd runc Docker CRI 运行

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

相关文章

  • Docker容器数据卷
    容器数据卷:将docker容器内的数据保存进宿主机的磁盘中1.容器卷命令中加入--privileged=trueDocker挂载主机目录访问如果出现cannotopendirectory.:Permissiondeni......
  • Containerd安装与使用
    2022-10-121|0Containerd的技术方向和目标简洁的基于gRPC的API和clientlibrary完整的OCI支持(runtime和imagespec)同时具备稳定性和高性能的定义良好的容......
  • Docker自动打包脚本
    前言:由于公司升级频繁,手动操作打包耗时较长,所以写了这个自动打包脚本提升工作效率。因为K8S的yaml都在内网阿里云上所以就没办法写进脚本修改版本了,如果有需要可以自行修改......
  • Docker | 数据持久化与数据共享
    数据持久化(安装MySQL)参考另一篇Docker安装mysql:https://www.cnblogs.com/all-smile/p/16778376.htmlMySQL的数据持久化问题#下载容器dockerpullmysql:5.7-d后......
  • 两个或多个docker容器之间通过名字相互访问
    前言需要部署的项目中有数据库和Tomcat,Tomcat需要连接到数据库容器的3306端口上,由于容器的IP地址会变化,又不能写死IP地址,所以就有了下文。docker网卡介绍docker......
  • dockerfile
    dockerbuild命令后"."这里的.号代表什么意思呢?Docker在运行时分为Docker引擎(服务端守护进程)以及客户端工具,我们日常使用各种docker命令,其实就是在使用客户端工......
  • IDEA 使用 Docker 插件,实现一键自动化部署
    一、docker开启远程连接访问​首先我们要开启docker的远程连接访问。保证不是docker所在的服务器,也能够远程访问docker。Linux版的docker:修改docker.service文件,添加监听......
  • docker和Namespace技术介绍
    一、docker介绍Docker是基于linux内核实现,Docker最早采用LXC技术(LinuXContainer的简写,LXC是Linux原生支持的容器技术,可以提供轻量级的虚拟化,可以说d......
  • install docker
    title:installdockerHowtoinstalldockerbyyum.yuminstallyum-utils-yyum-config-manager--add-repohttps://download.docker.com/linux/centos/docker......
  • 2022-08-23-docker
    title:installdockerHowtoinstalldockerbyyum.yuminstallyum-utils-yyum-config-manager--add-repohttps://download.docker.com/linux/centos/docker......