Docker、containerd、CRI-O 和 runc 之间的区别

容器与 Docker 这个名称并不紧密相关。你可以使用其他工具来运行容器

您可以使用 Docker 或一堆Docker 的其他工具来运行容器。docker只是众多选项之一,Docker(公司)在生态系统中创建了一些很棒的工具,但不是全部。

容器方面有两大标准:

  • 开放容器计划(OCI):一组容器标准,描述镜像格式、运行时和分发。
  • Kubernetes中的容器运行时接口(CRI)允许您在 Kubernetes 中使用不同容器运行时的 API。

Docker 堆栈的工作原理

  Docker Engine 附带一系列工具,让开发人员或系统管理员可以轻松构建和运行容器。它基本上 是一个用于处理容器的命令行界面 (CLI)。

因此,实际上,当您使用 运行容器时docker,您实际上是通过 Docker 守护进程运行它,它会调用 containerd,然后使用 runc。

docker命令只是拼图的一小部分。它实际上调用一些较低级别的工具来完成繁重的工作:

Docker 堆栈中的低级工具有哪些?

ddocker从下往上,这些是用于运行容器的工具:

  • 最低级别 🔩低级容器运行时。runc 是一个低级容器运行时。它使用 Linux 的原生功能来创建和运行容器。它遵循 OCI 标准,并包含libcontainer,这是一个用于创建容器的 Go 库。
  • 🔧高级容器运行时。containerd 位于低级运行时之上,并添加了许多功能,例如传输图像、存储和网络。它还完全支持 OCI 规范。
  • 👺 Docker 守护进程。dockerd 是一个守护进程(在后台运行的长时间运行的进程),它提供标准 API,并与容器运行时进行通信
  • 最高级别 👩‍💻 Docker CLI 工具。最后,docker-cli让您能够使用命令与 Docker 守护程序进行交互docker ...。这样您就可以控制容器,而无需了解较低级别。

Kubernetes 使用 Docker 吗?

一个非常常见的问题是“容器如何在 Kubernetes 中运行?”。Kubernetes 使用 Docker 吗?嗯,现在它不再使用 Docker 了——但以前是使用 Docker 的。

最初,Kubernetes 使用 Docker(Docker Engine)来运行容器。

但随着时间的推移,Kubernetes 逐渐演变成一个与容器无关的平台。Kubernetes中创建了容器运行时接口 (CRI) API,允许将不同的容器运行时插入其中。

Docker Engine 是一个比 Kubernetes 更老的项目,它没有实现 CRI。因此,为了帮助过渡,Kubernetes 项目包含了一个名为dockershim的组件,它允许 Kubernetes 使用 Docker 运行时运行容器。

它弥合了新旧世界之间的差距。

垫片(shim)的消亡

但从 Kubernetes 1.24 开始,dockershim 组件被彻底移除,Kubernetes 不再支持 Docker 作为容器运行时,你需要选择实现了 CRI 的容器运行时。

Kubernetes 集群中 Docker Engine 的逻辑继任者是...... containerd。(如果你答对了,可以得 10 分!)或者你也可以使用其他运行时,比如CRI-O。

这并不意味着 Kubernetes 无法运行所谓的 Docker 格式的容器。containerdCRI -O 都可以在 Kubernetes 中运行 Docker 格式和 OCI 格式的镜像;它们无需使用命令docker或 Docker 守护进程即可完成此操作。

开放容器计划 (OCI) 规范

OCI是首批为容器世界制定标准的组织之一。它由 Docker 和其他公司于 2015 年成立。

OCI 得到了众多科技公司的支持,并维护着容器镜像格式以及容器运行方式的规范。

例如:您可能对 Linux 主机使用一个符合 OCI 标准的运行时,但对 Windows 主机使用不同的运行时。

Kubernetes 容器运行时接口

我们需要讨论的另一个标准是容器运行时接口(CRI)。这是由 Kubernetes 项目创建的 API。

CRI 是 Kubernetes 用于控制创建和管理容器的不同运行时的接口。

因此,如果您更喜欢使用containerd在 Kubernetes 中运行容器,那么您可以这样做!或者,如果您更喜欢使用CRI-O,那么也可以。这是因为这两个运行时都实现了 CRI 规范。

但是,如果您付费从供应商处获得支持(安全性、错误修复等),那么您选择的容器运行时可能会为您做出选择。例如,Red Hat 的OpenShift 使用CRI-O,并为其提供支持。Docker 为他们自己的containerd提供支持。

containerd 和 CRI-O

我们已经看到 Docker Engine 调用了一堆底层工具。但这些工具是什么?它们如何组合在一起?

第一层是高级运行时:由 Docker 创建的containerd和由 Red Hat 创建的CRI-O 。

容器

  containerd是源自 Docker 的高级容器运行时。它实现了 CRI 规范。它从注册表中提取镜像,对其进行管理,然后将其移交给较低级别​​的运行时,后者使用 Linux 内核的功能来创建我们称为“容器”的进程。

克里欧

  CRI-O是另一个实现 Kubernetes 容器运行时接口 (CRI) 的高级容器运行时。它是 containerd 的替代品。它从注册表中提取容器映像,在磁盘上管理它们,并启动较低级别的运行时来运行容器进程。

是的,CRI-O 是另一个容器运行时。它诞生于 Red Hat、IBM、Intel 和 SUSE。

runc 和其他低级运行时

    r unc是一个兼容 OCI 的容器运行时,它实现了 OCI 规范并运行容器进程。

runc有时被称为 OCI 的“参考实现”。

其他低级运行时

   但是,runc 并不是唯一的低级运行时。OCI 规范允许其他工具以不同的方式实现相同的功能:

  • crun 是一个用C编写的容器运行时(相比之下,runc 是用 Go 编写的。)
  • AWS 的firecracker-containerd,它将 OCI 规范作为单独的轻量级虚拟机实现(它也与支持 AWS Lambda 的技术相同)
  • Google 的gVisor可以创建具有自己内核的容器。它在其运行时中实现了 OCI,称为runsc

概括

    有一套开放标准,理论上可以更轻松地更换不同的实现。containerd 、runcCRI -O等项目实现了这些标准的部分内容。

在 Kubernetes 中,你可以选择要使用的容器运行时,只要它支持 CRI API 即可。你可以使用containerdCRI-O

最后,这个故事的寓意是:

在 k8s 1.24 版本之后,docker/dockershim 已被弃用,即容器无法通过 docker 命令管理,
但您可以使用支持 CRI(K8s 原生 API)的其他容器运行时,
通过使用 crictl 命令(或其他支持的命令)来管理容器/pod,而不是 docker 命令。

通过 crictl 映射 docker cli :https://medium.com/@vineetcic/mapping-from-dockercli-to-crictl-life-after-docker-is-cri-a39ea5649d6c

享受!!!

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

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

相关文章

利用【MATLAB】和【Python】进行【图与网络模型】的高级应用与分析】

目录 一、图与网络的基本概念 1. 无向图与有向图 2. 简单图、完全图、赋权图 3. 顶点的度 4. 子图与连通性 5. 图的矩阵表示 MATLAB代码实例 Python代码实例 二、最短路径问题 1. 最短路径问题的定义 2. Dijkstra算法 MATLAB代码实例 Python代码实例 三、最小生…

无法启动此程序,因为计算机丢失api-ms-win-core-path-l1-1-0.dll的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

Microsoft Visual C++ 2010 Express 使用

Microsoft Visual C 2010 Express 使用 Microsoft Visual C 2010 Express(简称VC 2010 Express)是一款免费的集成开发环境(IDE),专为C和C语言的开发者设计。 安装 下载|本站链接【VC2010简体中文版】的安装包并解压…

C#学习-刘铁猛

文章目录 1.委托委托的具体使用-魔板方法回调方法【好莱坞方法】:通过委托类型的参数,传入主调方法的被调用方法,主调方法可以根据自己的逻辑决定调用这个方法还是不调用这个方法。【演员只用接听电话,如果通过,导演会…

mysql oracle postgreSQL区别

MySQL、Oracle Database和PostgreSQL是三种流行的关系型数据库管理系统(RDBMS),它们各有特点,适用于不同的应用场景。以下是它们之间的一些主要区别: 1.许可证和成本: 1.MySQL是一个开源数据库,…

一个集Swagger2 和 OpenAPI3为一体的增强接口文档工具,一把为您的API文档需求量身定制的“利刃”(附源码)

前言 在微服务和分布式系统架构日益普及的今天,API文档的管理与维护成为了开发过程中的一个关键环节。开发者们常常面临着API文档更新不及时、格式不统一、难以维护和阅读的问题。此外,随着API数量的增加,管理和维护这些文档变得越来越复杂。…

unity2022 il2cpp 源码编译

新建一个XCODE静态库工程 从unity安装目录中找到il2cpp源码 Editor\Data\il2cpp\ 改名 il2cpp/libil2cpp -> il2cpp/il2cpp 加入工程中 ->工程根目录 extends/zlib libil2cpp/ buildSettings 相关设置 IOS Deployment Target ios 12.0 Header Search Paths $(in…

Anthropic的Claude安卓版能否赢得用户青睐?

Anthropic的Claude安卓版能否赢得用户青睐? 前言 Anthropic 就在7月18日,这家以"可控AI"著称的初创公司再次出手,推出了Claude的Android版本应用。这款APP不仅支持实时语言翻译,更传承了Anthropic一贯的隐私保护政策。C…

C++游戏时间——Maker_Game游戏头文件组1.0

我们都知道,C++可以写控制台、图形界面、静态库程序。 这几天,我写游戏都写炸毛了,但对于对静态库一窍不通的我,只能写图形库和控制台。 于是。。。。 Maker_Game游戏头文件组1.0诞生了! #include <Maker_Game/Ege.h> #include <Maker_Game/Console.h> Co…

基于SpringBoot+Vue的校园志愿者管理系统(带1w+文档)

基于SpringBootVue的校园志愿者管理系统(带1w文档) 基于SpringBootVue的校园志愿者管理系统(带1w文档) 本次设计任务是要设计一个校园志愿者管理系统&#xff0c;通过这个系统能够满足管理员和志愿者的校园志愿者信息管理功能。系统的主要功能包括首页、个人中心、志愿者管理、…

pytorch学习(十六)conda和pytorch的安装

1.安装anaconda 1.1 首先下载安装包 1&#xff09;进入anaconda官网 Anaconda | The Operating System for AI 2&#xff09;注册一下 3&#xff09;下载 4&#xff09;一直点直到安装完 5&#xff09;配置环境变量 在path路径中加入 Anaconda安装路径 Anaconda安装路径\S…

LeetCode 123题: 买卖股票的最佳时机 III代码优化(原创)

之前完成了LeetCode 123题&#xff1a; 买卖股票的最佳时机 III&#xff08;原创&#xff09;-CSDN博客&#xff0c;虽然完成代码编写&#xff0c;并提交成功&#xff0c;但运行效率不是很高。执行时长高达62ms&#xff0c;见下图&#xff1a; 看了下代码感觉可以通过将三维数组…

提交(git-add git-commit git-push)

当修改好一个功能的时候&#xff0c;可以提交到远程仓库&#xff0c;这样就等于更新了一次版本&#xff0c;那么下次改修了文件的话&#xff0c;是跟这个版本做对比的 git status&#xff0c; 查看文件修改情况&#xff0c;git add 假如你只想提交1个文件&#xff0c;那么直接…

IOC、DI<5> Unity、AOP、延迟获取对象、检索容器中注册信息

Unity.InterceptionExtension.ICallHandler实现一个操作日志记录功能 其它跟上一次一样 <?xml version"1.0" encoding"utf-8" ?> <configuration><configSections><section name"unity" type"Microsoft.Practice…

新手入门python该如何开始学习?学习路线是什么呢?

今天这篇文章从三个点给大家介绍一下新手学习Python的正确路线是什么、python最核心的知识点是什么 Python学习路线 Python学习路线可以大致分为以下几个阶段&#xff0c;每个阶段都包含了一系列核心知识点和技能&#xff1a; 第一阶段&#xff1a;Python基础 Python语言基础…

扫描某个网段下存活的IP:fping

前言&#xff1a; 之前用arp统计过某网段下的ip&#xff0c;但是有可能统计不全。网络管理平台又不允许登录。想要知道当前的ip占用情况&#xff0c;可以使用fping fping命令类似于ping&#xff0c;但比ping更强大。与ping需要等待某一主机连接超时或发回反馈信息不同&#x…

递归与迭代

1. 概念区别 递归&#xff08;recursion&#xff09;&#xff1a;递归常被用来描述以自相似方法重复事物的过程&#xff0c;在数学和计算机科学中&#xff0c;指的是在函数定义中使用函数自身的方法。&#xff08;A调用A&#xff09; 迭代&#xff08;iteration&#xff09;&…

nodejs学习之Rollup

官网 https://github.com/rollup/rollup 英文文档 中文文档 是什么 Rollup 是一个用于 JavaScript 的模块打包工具&#xff0c;它将小的代码片段编译成更大、更复杂的代码&#xff0c;例如库或应用程序。它使用 JavaScript 的 ES6 版本中包含的新标准化代码模块格式&#xf…

数据挖掘与分析部分实验内容

一、机器学习算法的应用 1. 朴素贝叶斯分类器 相关代码 import pandas as pd from sklearn.model_selection import train_test_split from sklearn.naive_bayes import GaussianNB, MultinomialNB from sklearn.metrics import accuracy_score # 将数据加载到DataFrame中&a…

基于声学基元的高质量空间音频生成框架

关键词&#xff1a;人体姿态、声学基元、空间音频建模、体积渲染 过去几年中&#xff0c;渲染和动画制作逼真的3D人体模型技术已经发展成熟&#xff0c;并且达到了令人印象深刻的质量水平。然而&#xff0c;与这些全身模型相关联的空间音频建模&#xff0c;却在很大程度上被忽视…