一文了解OCI标准、runC、docker、contianerd、CRI的关系

news/2024/12/22 20:37:24/

docker和contanerd都是流行的容器运行时(container runtime);想讲清楚他们两之间的关系,让我们先从runC和OCI规范说起。

一、OCI标准和runC

1、OCI(open container initiative)

OCI是容器标准化组织为了推进容器技术的发展,对容器标准进行的定义;方便业界按照统一的标准进行容器开发,在2015年由Docker公司牵头制定了容器标准;OCI目前包括了两个标准:runtime-spec和image-spec,分别定义了容器运行时标准和容器镜像标准。

2、runC

runC是基于OCI规范开发的一个轻量级的容器运行时,他是一个GO语言编写的轻量级工具;他用于在linux系统中管理容器的生命周期,包括容器的创建、删除、列出、杀死、删除,但是不包括镜像的管理。
runc也是docker、containerd内部实现容器管理的工具。

3、Low-Level和High-Level容器运行时

低级容器运行时和高级容器运行时是容器技术中的两种不同类型。

​ 低级容器运行时主要处理底层细节,利用Linux内核功能namespace和Cgroups来运行、创建容器。namespace可以让你为每个容器提供虚拟化系统资源,比如文件系统和网络,Cgroup提供了限制每个容器所能使用的资源,比如内存和CPU。它们负责创建和运行容器,但不处理像镜像构建、镜像管理、网络等高级运行时提供的功能。

​ 高级容器运行时则提供更多功能,如管理容器的生命周期、管理镜像、存储管理、网络管理。高级容器运行时将容器运行的实现交给了runc。

低级容器运行时可以通过OCI规范与高级容器运行时(如containerd)进行交互。高级容器运行时会提供一个config.json文件给低级运行时,然后由低级运行时创建容器

dockercontainerd_23">二、docker与containerd

1、containerd

containerd是一个高级的容器运行时,他与runc不同,runc执行是一个命令行工具,而containerd可以在宿主机上管理完整的容器生命周期,包括镜像的传输与存储、容器的执行与管理存储、网络等;

containerd是从docker中分离出来的一个项目,他比docker更加轻量,摒弃了一些与容器编排冲突的功能,所以可以作为底层的容器运行时,他现在成了新版本kuberbetes默认的容器运行时,后面再详细说明为什么kubernetes会选择containerd作为容器运行时,下图为以containerd做为底层容器运行时的平台。
在这里插入图片描述

docker_32">2、docker

docker_34">1.docker概述

docker容器技术的颠覆者,通过轻量级容器化、简单操作命令的方式实现了应用打包和交付运行。

Docker Daemon整体架构采用C/S模式,主要有客户端和服务器两大部分组成。客户端负责发送命令,服务端负责接收命令。

2.Docker Daemon组件构成

下图包含了runC、containerd-shim、containerd、docker之间的层级关系

在这里插入图片描述

docker相关的组件

  • dockerdocker命令,也就是docker客户端
  • dockerd:dockerd进程,一般都是后台运行,接收docker客户端发来的指令
  • docker-init:可以在启动的时候添加 --init参数,以docker-init作为1号进程,负责管理容器内的子进程
  • docker-proxy:主要作端口映射,底层依赖iptables实现

containerd相关组件

  • containerd:管理容器、镜像、存储、网络,后台是一个常驻进程,通过套接字接收dockerd发送的请求
  • containerd-shim:主要将真正的容器与containerd解耦,使用containerd-shim作为容器进程的父进程,从而实现重启containerd而不影响容器进程。
  • ctr:containerd的客户端工具

容器运行时相关组件

  • runc:unc 是一个标准的 OCI 容器运行时的实现,它是一个命令行工具,可以直接用来创建和运行容器

三、CRI接口

1、CRI概述

Kubernetes为了实现可插拔设计,提供了三个接口,分别是容器网络接口CNI、容器运行时接口CRI、容器存储接口CSI,只要满足相应的接口信息,便可以接入到kubernetes中。

kubernetes的1.5版本以前,k8s依赖docker,为了支持不同的容器运行时,也为了与docker解耦,便开放了CRI标准,方便kubernetes与其他容器运行时进行对接。

2、CRI支持后端

  1. cri-o
  2. docker
  3. cri-containerd
  4. rkt
  5. frakti

dockershim_80">3、dockershim

kubernetes提出CRI规范时,docker并不支持CRI标准,由于当时Docker在容器运行时领域是绝对权威的存在,kubernetes在kubelet中加入了docker-shim,用来对接docker与kubelet,使docker可以兼容。实际的链路是:

在这里插入图片描述

后来越来越多的容器运行时开始支持CRI接口,kubernetes在1.24版本的kubelet中正式删除了dockershim,改成了直接对接containerd(此版本已经支持CRI,containerd由docker公司开源),这种链路更加简洁,效率更高。

在这里插入图片描述

新版本的containerd已经将CRI-containerd集成到containerd中,整个链路更加简洁。

请添加图片描述


http://www.ppmy.cn/news/1429157.html

相关文章

用Qt+NetCDF 读取NC文件

用QtNetCDF 读取NC文件_ivqtnc-CSDN博客 基于NetCDF-CXX4 封装&#xff0c;对NC文件进行读取&#xff0c;读取内存放到vector中。 ncBase.h #ifndef __NC_BASE_H__ #define __NC_BASE_H__#include <QVariant> #include <vector> #include <map> using na…

【Linux】系统安全及应用

目录 一、账号安全基本措施 1.系统账号清理 2.密码安全控制 3.历史命令安全管理 4.限制su切换用户 1&#xff09;将信任的用户加入到wheel组中 2&#xff09;修改su的PAM认证配置文件 5.ssh远程登录输入三次密码错误则锁定用户 二、Linux中的PAM安全认证 1.su命令的…

mfc140.dll丢失如何修复,分享多种有效的修复方法

在日常操作和使用电脑的过程中&#xff0c;我们可能会遇到一种较为常见的问题&#xff0c;即在尝试启动或运行某个应用程序时&#xff0c;系统突然弹出一个错误提示窗口&#xff0c;明确指出“mfc140.dll文件丢失”。这个mfc140.dll实际上是一个动态链接库文件&#xff08;DLL&…

虚幻引擎源码版安装下载,点击GenerateProjectFiles.bat报错 error NU1101NuGet包问题解决参考方案

开发环境配置与源码安装使用 安装VS2022 按照官方文档安装需要的vs配置 虚幻引擎源代码下载 Epic里面下载的引擎与源代码引擎区别&#xff1a;Epic里面下载的引擎是已经编译过的它的源代码访问权限不完整&#xff0c;源代码版本提供比较完整引擎代码&#xff0c;并且可以修…

【iOS安全】iOS ARM汇编

mov指令 MOV X22, X0 将X0的值移到X22中 参数传递 参数1&#xff1a;寄存器X0传递 参数2&#xff1a;寄存器X1传递 参数3&#xff1a;寄存器X2传递 参数4&#xff1a;寄存器X3传递 &#xff08;这里的X0传递的就是第一个实际参数&#xff0c;而不是self、selector之类的&…

mac tcp实现客户端与服务端进行图像传输及处理

客户端发送图像到服务端&#xff0c;服务端对图像进行处理&#xff0c;在将处理后的图像发送到客户端&#xff0c;并且服务端持续监听客户端。 客户端 #include <iostream> #include <fstream> #include <vector> #include <unistd.h> #include <…

Jackson知识点记录

文章目录 一.Jackson模块说明 二.ObjectMapper基本功能使用ObjectMapper的一些核心方法&#xff1a;示例代码1. 序列化示例2. 反序列化示例3. JsonNode 处理示例 高级配置 三.各种Node1. ObjectNode2. ArrayNode3. ValueNode4. MissingNode示例 一.Jackson Jackson 库主要分为…

Cjson 库使用

1. JSON简介 JSON全称 JavaScript Object Notation&#xff0c;即 JS对象简谱&#xff0c;是一种轻量级的数据格式。 它采用完全独立于编程语言的文本格式来存储和表示数据&#xff0c;语法简洁、层次结构清晰&#xff0c;易于人阅读和编写&#xff0c;同时也易于机器解析和生成…