CRI-O, Containerd, Docker, Postman等概念介绍

news2024/12/25 14:41:50
参考: Docker,containerd,CRI,CRI-O,OCI,runc 分不清?看这一篇就够了
Docker, containerd, CRI-O and runc之间的区别?
Docker、Podman、Containerd 谁才是真正王者?
CRI-O vs Podman vs Docker vs CRI-containerd

1 容器的主要标准:

  • Open Container Initiative (OCI) ,定义容器和镜像的标准

  • Container Runtime Interface (CRI),它定义了Kubernetes和下面的容器运行时之间的API


  • OCI

  • OCI (Open Container Initiative),是一个轻量级,开放的治理结构(项目)。在 Linux 基金会的支持下成立,致力于围绕容器格式和运行时创建开放的行业标准。

  • OCI 项目由 Docker、CoreOS 和容器行业中的其它领导者在 2015 年 6 月的时候启动,OCI 的技术委员会成员包括 Red Hat、Microsoft、Docker、Cruise、IBM、Google、Red Hat 和 SUSE 等。

  • CRI

  • CRI(Container Runtime Interface)是 Kubernetes v1.5 引入的容器运行时接口,它将 Kubelet 与容器运行时解耦,将原来完全面向 Pod 级别的内部接口拆分成面向 Sandbox 和 Container 的 gRPC 接口,并将镜像管理和容器管理分离到不同的服务。

2 CRI-O, Docker, Containerd三者区别

  1. CRI-O:

  1. 实现了容器运行时接口(CRI)的高级别容器运行时,实现了CRI规范。

  1. 可以使用 OCI(开放容器倡议)兼容的运行时,是 containerd 的一个替代品。

  1. 是专门为Kubernetes创建的一个容器运行时,与 containerd 相同,提供了拉取、推送镜像,管理网络,存储的能力

  1. 通过直接调用底层的runc,实现启动、停止和重启容器的管理.

  1. CRI-O 诞生于 RedHat、IBM、英特尔、SUSE、Hyper 等公司。

  1. Podman:

  1. Podman原来是CRI-O项目的一部分,后来被分离成了一个单独的项目libpod。

  1. Docker

  1. 需要先调用dockershim,然后调用docker,再调用containerd,最后调用底层的 runc.

  1. CRI-Containerd:

  1. CRI的实现,通过Containerd调用底层的runc.

  1. Containerd

  1. Containerd是一个进程,是CRI-Containerd的实现,用来拉取、推送镜像,管理网络,存储调用底层runc来运行容器,并且管理容器的运行。

  1. containerd 是一个来自 Docker 的高级容器运行时,并实现了 CRI 规范。

  1. containerd从 Docker 项目中分离出来,使Docker更加模块化,之后 containerd 被捐赠给云原生计算基金会(CNCF)为容器社区提供创建新容器解决方案的基础。

  1. Docker 内部使用 containerd,安装 Docker 时也会安装 containerd。

  1. containerd 通过其 CRI 插件实现了 Kubernetes 容器运行时接口(CRI),它可以管理容器的整个生命周期,包括从镜像的传输、存储到容器的执行、监控再到网络。


  • runc:

  • 底层容器运行时,或者实际创建和运行容器的组件,它包括libcontainer,这是一个基于go的本地实现,用于创建、启动、停止和重启容器的管理

  • runc 是轻量级的通用运行时容器,它遵守 OCI 规范,是实现 OCI 接口的最低级别的组件,与内核交互创建并运行容器。

  • runc 为容器提供了所有的低级功能,与现有的低级 Linux 功能交互,如命名空间和控制组,它使用这些功能来创建和运行容器进程。

  • runc 是一个在 Linux 上运行容器的工具,所以这意味着它可以在 Linux 上、裸机上或虚拟机内运行。

  • runc 的几个替代品:

  • crun [5]:一个用 C 语言编写的容器运行时(相比之下,runc 是用Go编写的。)来自 Katacontainers 项目的 kata-runtime [6] 它将 OCI 规范实现为单独的轻量级虚拟机(硬件虚拟化)。

  • Google 的 gVisor [7],创建了拥有自己内核的容器,在其运行时中实现了 OCI,称为 runsc。

  • dockershim:

  • Docker比Kubernetes更古老,没有实现CRI。dockershim把Docker连接到Kubernetes上,或者是Kubernetes连接到Docker上。

  • dockershim支持将 Docker 被硬编码到 Kubernetes 中。随着容器化成为行业标准,Kubernetes 项目增加了对额外运行时的支持,比如通过 Container Runtime Interface (CRI) 容器运行时接口来支持运行容器。因此 dockershim 成为了 Kubernetes 项目中的一个异类,对 Docker 和 dockershim 的依赖已经渗透到云原生计算基金会(CNCF)生态系统中的各种工具和项目中,导致代码脆弱。

  • 2022 年 4 月 dockershim 将会从 Kubernetes 1.24 中完全移除。今后 Kubernetes 将取消对 Docker 的直接支持,而倾向于只使用实现其容器运行时接口的容器运行时,这可能意味着使用 containerd 或 CRI-O。这并不意味着 Kubernetes 不能运行 Docker 格式的容器。

  • containerd 和 CRI-O 都可以运行 Docker 格式(实际上是 OCI 格式)的镜像,它们只是无需使用 docker 命令或 Docker 守护程序。

3 Docker,k8s,CRI, OCI, containerd和runc关系图

4 Docker VS Podman

Podman与Linux内核交互,通过runC容器运行时进程而不是Daemon来管理容器。Buildah实用程序用于替代Docker build作为容器镜像构建工具,Docker push被Skopeo替代,用于在注册表和容器引擎之间移动容器镜像。

(1) 架构

Docker使用守护进程,一个正在后台运行的程序,来创建镜像和运行容器。Podman是无守护进程的架构,这意味着它可以在启动容器的用户下运行容器。Docker有一个由守护进程引导的客户端——服务器逻辑架构;但Podman不需要此类守护进程。

(2) Root特权

由于Podman没有守护进程来管理其活动,也无需为其容器分配Root特权。Docker最近在其守护进程配置中添加了Rootless模式,但Podman首先使用了这种方法,并将其作为基本特性进行了推广。原因如下。

(3) 安全

Podman比Docker安全吗?Podman允许容器使用Rootless特权。Rootless容器被认为比Root特权的容器更安全。在Docker中,守护进程拥有Root权限,这使得它们易成为攻击者的首选入侵点。
Podman中的容器默认情况下不具有Root访问权限,这在Root级别和Rootless级别之间添加了一个自然屏障,提高了安全性。不过,Podman可以同时运行Root容器和Rootless容器。

(4) Systemd

如果没有守护进程,Podman需要另一个工具来管理服务并支持后台运行的容器。Systemd为现有容器创建控制单元或用来生成新容器。Systemd还可以与Podman集成,允许它在默认情况下运行启用了Systemd的容器,从而无需进行任何修改。
通过使用Systemd,供应商可以将他们的应用程序封装为容器用来安装、运行和管理,因为现在大多数应用程序都是通过这种方式打包和交付的。

(5) 构建镜像

作为一款自给自足的工具,Docker可以自己构建容器镜像。Podman则需要另一种名为Buildah的工具的辅助,该工具充分体现了它的特殊性:它是为构建镜像而设计的,而不是为构建容器而生。

(6) Docker Swarm

Podman不支持Docker Swarm,这可能会在某些项目中被刨除在外,因为使用Docker Swarm命令会产生一个错误。然而,Podman最近增加了对Docker Compose的支持,使其与Swarm兼容,从而克服了这个限制。当然,Docker由于其原生的特性,与Swarm当然融合得很好。

(7) All in one vs 模块化

Docker是一个独立的、强大的工具,在整个循环中处理所有的容器化任务,有优点也有缺点。Podman采用模块化的方法,依靠专门的工具来完成特定的任务。

5 Docker容器运行架构图

当用 docker命令运行一个容器时,实际上是通过 docker守护进程调用 containerd,然后 containerd调用runc运行容器。
  • docker:命令行工具,终端用户使用这个命令来和docker进行交互

  • containerd,containerd是一个进程,用来拉取、推送镜像,管理网络,存储,然后使用runc来运行容器,并且管理容器的运行

  • runc:这是底层容器运行时,或者实际创建和运行容器的组件)。它包括libcontainer,这是一个基于go的本地实现,用于创建容器

6 原始容器运行时Runc

最终用户到实际的容器调用链示意图:

  • runc 是一个命令行客户端,用于运行根据 Open Container Initiative (OCI) 格式打包的应用程序,并且是 Open Container Initiative 规范的兼容实现。

  • runc 符合容器和管理容器映像的开放容器计划(OCI) 和规范,也有其他符合 OCI 的运行时,甚至可以运行符合 OCI 标准的虚拟机,Kata Containers 与gVisor就是符合符合 OCI 标准的虚拟机。gVisor 为代表的用户态 Kernel 方案是安全容器的未来,只是现在还不够完善。

  • runc 希望提供一个“ OCI 包”,它只是一个根文件系统和一个config.json 文件。而不是Podman 或 Docker 那样有“镜像”概念,所以不能只执行runc run nginx:latest这样来启动一个容器。

  • Runc 符合 OCI 规范(具体来说,是runtime-spec),可以使用 OCI 包并从中运行一个容器。值得重申的是,这些bundle并不是“容器镜像”,它们要简单得多。层、标签、容器注册表和存储库等功能 - 所有这些都不是 OCI 包甚至运行时规范的一部分。有一个单独的 OCI-spec (image-spec )定义镜像。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/374597.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最简单的代码生成器,smartsofthelp netframework ,EF 架构

1.原生 sql操作公共类 dbhelper2.model 带注释的实体3.EF功能访问调用类3.EFData EF数据接口层4.UI展示层数据库脚本 自动生成Model /// <summary>/// Model实体层 /// </summary>namespace Smart.Model{/// <summary>/// 数据实体层 T_Eventsmart 投屏事件/…

CI/CD | 深入研究Jenkins后,我挖掘出了找到了摆脱低效率低下的方法

在本系列的第一篇文章中&#xff0c;您已经了解了一些关于如何管理Jenkins的内容&#xff0c;主要是为无序的人带来秩序。在这篇文章中&#xff0c;我将更深入地探讨我效率低下的问题&#xff0c;提出我们工作流中一些安全性、治理和合规性的挑战。这不仅仅是你在网站上或展览横…

从此不怕被盗号:教你如何用 Python 制作一个密码生成器

原由&#xff1a; 定期更换密码是一种非常重要的安全措施&#xff0c;这种做法可以有效地保护你的账户和个人信息不受黑客和网络攻击者的侵害。 密码泄露是一个非常普遍的问题&#xff0c;许多人的账户和密码经常会被泄露出来&#xff0c;导致个人信息被盗用、金融损失、恶意…

hive建分区表,分桶表,内部表,外部表

hive建分区表&#xff0c;分桶表&#xff0c;内部表&#xff0c;外部表 一、概念介绍 Hive是基于Hadoop的一个工具&#xff0c;用来帮助不熟悉 MapReduce的人使用SQL对存储在Hadoop中的大规模数据进行数据提取、转化、加载。Hive数据仓库工具能将结构化的数据文件映射为一张数…

Redis 如何实现库存扣减操作和防止被超卖

在日常开发中有很多地方都有类似扣减库存的操作&#xff0c;比如电商系统中的商品库存&#xff0c;抽奖系统中的奖品库存等。其基本的流程如下:1 解决方案使用mysql数据库&#xff0c;使用一个字段来存储库存&#xff0c;每次扣减库存去更新这个字段。还是使用数据库&#xff0…

自动视觉锁螺丝机及其控制系统

1.全自动智能锁螺丝机的意义电子消耗品、家用电器、汽车零件、音箱、安防、玩具、LED 等制造业的生产过程中&#xff0c;产品组装是一个非常重要的步骤&#xff0c;而螺丝锁付是组装过程的核心工艺之一。当下国内智能手机、智能汽车、智能家电等产品更新换代快&#xff0c;产品…

深入理解C#的协变和逆变及其限制原因

阅读本文需要的一些前置知识&#xff1a; C#基本语法、C#的泛型使用、C#的运行过程 由于协变和逆变存在一些细节&#xff0c;在阅读时请注意“接口”和“类型”的差异&#xff0c;此外&#xff0c;文中有可能在不同的语境中将“结构体”和“值类型”混用&#xff0c;但表达的同…

JavaEE简单实例——MyBatis一对多关联映射的嵌套结果集查询

简单介绍&#xff1a; 在之前的章节&#xff0c;我们简单介绍了MyBatis中的一对一的关联查询&#xff0c;使用了嵌套查询和嵌套结果集两种方式进行讲解&#xff0c;但是在实际的使用中&#xff0c;我们常用的是嵌套结果集的查询方式&#xff0c;所以在一对多的查询中&#xff…

无线耳机哪个品牌音质好?2023无线蓝牙耳机音质排行

现今&#xff0c;外出佩戴蓝牙耳机的人越来越多&#xff0c;各大品牌厂商对于蓝牙耳机各种性能的设计也愈发用心。那么&#xff0c;无线耳机哪个品牌音质好&#xff1f;下面&#xff0c;我来给大家推荐几款音质好的无线蓝牙耳机&#xff0c;可以当个参考。 一、南卡小音舱蓝牙…

【人工智能】科大讯飞API接口调用(第一集)

前言 这学期有一门人工智能教育课程&#xff0c;恰巧又有这么一个实践&#xff0c;要求进行人工智能接口调用 于是首选了科大讯飞&#xff0c;下面是详细过程记录 科大讯飞接口调用 以下是流程以及实现细节描述 调用流程 第一步 来到科大讯飞开放平台 http://www.xfyun.…

四、阻塞队列

文章目录基础概念生产者消费者概念JUC阻塞队列的存取方法ArrayBlockingQueueArrayBlockingQueue的基本使用生产者方法实现原理ArrayBlockingQueue的常见属性add方法实现offer方法实现offer(time,unit)方法put方法消费者方法实现原理remove方法poll方法poll(time,unit)方法take方…

wpf -绑定

事件双向驱动滑块变化&#xff0c;将值赋给文本控件与控件之间双向绑定{Binding ElementNameslider, PathValue}ElementName: 绑定哪个控件呢&#xff1f; 指绑定的x:Name这个控件Path &#xff1a; 绑定哪个属性呢&#xff1f;Value<StackPanel><Slider x:Name"…

Python每日一练(20230227)

目录 1. 路径交叉 ★★★ 2. 缺失的第一个正数 ★★★ 3. 寻找两个正序数组的中位数 ★★★ 附录 散列表 基本概念 常用方法 1. 路径交叉 给你一个整数数组 distance 。 从 X-Y 平面上的点 (0,0) 开始&#xff0c;先向北移动 distance[0] 米&#xff0c;然后向西移…

ChatGPT提高你日常工作的五个特点,以及如何使用它来提高代码质量

ChatGPT已经完全改变了代码开发模式。然而&#xff0c;大多数软件开发者和数据专家们仍然不使用ChatGPT来完善——并简化他们的工作。 这就是我们在这里列出提升日常工作效率和质量的5个不同的特点的原因。 让我们一起来看看在日常工作中如何使用他们。 警告&#xff1a;不要…

第十一届“泰迪杯”数据挖掘挑战赛赛前指导安排

第十一届“泰迪杯”挑战赛报名一周了&#xff0c;许多的参赛队伍及带队老师都在咨询我们赛前指导安排及内容&#xff0c;今年的赛前指导安排还是分为了赛前指导录播课程及赛前指导直播两个模块。小编这就为大家介绍一下吧。 赛前指导 赛前指导录播课程 2月25日9:00-4月14日 …

vue中的百度地图的搜索定位功能

效果图 申请百度地图AK 前往 百度地图开放平台控制台 &#xff0c;登录百度账号&#xff0c;创建应用即得。 封装loadBMap.js文件 /*** 动态加载百度地图api函数* param {String} ak 百度地图AK&#xff0c;必传*/ export default function loadBMap(ak) {return new Promise…

C语言|文件读写,代码运行后留下“记忆”

前言对于一个代码&#xff0c;运行时可能需要保留产生的结果&#xff0c;例如计算值&#xff0c;筛选值&#xff0c;记录点或者小游戏的得分&#xff0c;而正常情况下我们要保存一个数据&#xff0c;想到的肯定是打开我们的文本软件&#xff0c;手撸文字&#xff0c;今天这篇文…

Flutter 数据传递

在应用开发过程中数据传递&#xff0c;flutter提供 InheritedWidget 以及多种 provider, 各有差异从从使用习惯上面 这边主要介绍以下两种&#xff1a; InheritedWidgetprovider &#xff08;ChangeNotifier&#xff09;InheritedWidget&#xff1a; 提供一种 从上而下 的数据…

线上研讨会报名 | Perforce、中手游、星思半导体专家邀您一起畅聊如何通过数字资产管理与版本控制赋能大规模研发

全球领先的数字资产管理与DevSecOps工具厂商Perforce联合中国授权合作伙伴龙智举办的Perforce on Tour网络研讨会将于2月28日下午2:00举行。 本次研讨会以“赋能‘大’研发&#xff0c;助力‘快’交付”为主题&#xff0c;龙智董事长何明、Perforce高级顾问Robert Cowham&…

SpringMVC的基础知识以及如何使用各注解

1.SpringMVC的概述 学习SpringMVC我们先来回顾下现在web程序是如何做的&#xff0c;咱们现在web程序大都基于三层架构来实现。 三层架构 浏览器发送一个请求给后端服务器&#xff0c;后端服务器现在是使用Servlet来接收请求和数据 如果所有的处理都交给Servlet来处理的话&am…