【Docker】进阶之路:(五)Docker引擎

【Docker】进阶之路:(五)Docker引擎

  • Docker引擎简介
  • Docker引擎的组件构成
    • runc
    • containerd

Docker引擎简介

Docker引擎是用来运行和管理容器的核心部分。Docker首次发布时,Docker 引擎由LXC 和 Docker daemon 两个核心组件构成。

Docker daemon 是单一的二进制文件,包含诸如 Docker 客户端、Docker API、容器运行时、镜像构建等。 LXC 提供了对诸如命名空间(Namespace)和控制组(CGroup)等基础工具的操作能力,它们是基于 Linux 内核的容器虚拟化技术。

在 Docker 旧版本中,Docker daemon、LXC 和操作系统之间的交互关系。
在这里插入图片描述
其中,LXC是基于Linux的,存在对外部工具的严重依赖关系,对于Docker的跨平台目标的实现是个问题。因此,Docker公司开发了名为Libcontainer的自研工具,用于替代LXC。Libcontainer的目标是成为与平台无关的工具,可基于不同内核为Docker上层提供必要的容器交互功能。在Docker 0.9版本中,Libcontainer取代LXC成为默认的执行驱动。同时,Docker的整体性带来了越来越多的问题。难于变更、运行越来越慢,这对于Docker生态的发展来说弊大于利。Docker公司意识到了这些问题,开始努力着手拆解这个大而全的Dockerdaemon,并将它模块化。尽可能地拆解出其中的功能特性,并用小而专的工具来实现它。这些小工具可以是可替换的,也可以被第三方拿去用于构建其他工具。目前,所有容器执行和容器运行时的代码已经完全从daemon中移除,并重构为小而专的工具。

在改进版本中,基于开放容器计划,Docker引擎采用了模块化的设计原则,组件是可以替换的。Docker引擎主要由Docker Client、Docker daemon、containerd、runc组成,共同负责容器的创建和运行。
在这里插入图片描述

Docker引擎的组件构成

runc

在 Docker daemon 进程的拆解和重构时,OCI 也正在着手定义两个容器相关的规范,即镜像规范和容器运行时规范,两个规范均于 2017 年 7 月发布了 1.0 版。

Docker 公司参与了这些规范的制定工作,并贡献了许多代码。从 Docker 1.11 版本(2016 年初)开始,Docker 引擎尽可能实现了 OCI 的规范。例如,Docker daemon 不再包含任何容器运行时的代码——所有的容器运行代码在一个单独的 OCI 兼容层中实现。默认情况下,Docker 使用 runc 来实现这一点。runc 是 OCI 容器运行时标准的参考实现,如上面图5-3中的 runc 容器运行时层。runc 项目的目标之一就是与 OCI 规范保持一致。目前 OCI 规范均为 1.0 版本,我们不希望它们频繁地迭代,毕竟稳定胜于一切。除此之外,Docker 引擎中的 containerd 组件确保了 Docker 镜像能够以正确的 OCI Bundle 的格式传递给 runc。其实,在 OCI 规范以 1.0 版本正式发布之前,Docker 引擎就已经遵循该规范实现了部分功能。

runc实质上是一个轻量级的、针对Libcontainer进行了包装的命令行交互工具。Libcontainer取代了早期Docker架构中的LXC。runc的作用是创建容器,而且速度非常快。不过runc是一个CLI包装器,实质上就是一个独立的容器运行时工具。因此,直接下载runc或基于源码编译二进制文件,即可拥有一个全功能的runc。但runc只是一个基础工具,并不提供类似Docker引擎所拥有的丰富功能。

有时也将runc所在的架构层称为OCI层。关于runc的发布信息见GitHub中opencontainers/runc库的release。

containerd

在对 Docker daemon 的功能进行拆解后,所有的容器执行逻辑被重构到一个新的名为 containerd(发音为 container-dee)的工具中。Containerd的主要任务是容器的生命周期管理,即start | stop | pause | rm … containerd等。它在 Linux 和 Windows 中以 daemon 的方式运行,从 1.11 版本之后 Docker 就开始在 Linux 上使用。

Docker 引擎技术栈中,containerd 位于 daemon 和 runc 所在的 OCI 层之间。Kubernetes 也可以通过 cri-containerd 使用 containerd。

正如Docker 引擎简介中所述,containerd 最初被设计为轻量级的小型工具,仅用于容器的生命周期管理。然而,随着时间的推移,它被赋予了更多的功能,例如镜像管理等。其原因之一是,这样便于在其他项目中使用containd。例如,在 Kubernetes 中,containerd 就是一个很受欢迎的容器运行时。然而在 Kubernetes项目中,如果 containerd 能够完成一些诸如 push 和 pull 镜像这样的操作就更好了。因此,如今的 containerd 还能够完成一些除容器生命周期管理之外的操作。不过,所有的额外功能都是模块化的、可选的,便于自行选择所需功能。 Kubernetes项目在使用 containerd 时,可以仅包含所需的功能。

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

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

相关文章

linux驱动开发——内核调试技术

目录 一、前言 二、内核调试方法 2.1 内核调试概述 2.2 学会分析内核源程序 2.3调试方法介绍 三、内核打印函数 3.1内核镜像解压前的串口输出函数 3.2 内核镜像解压后的串口输出函数 3.3 内核打印函数 四、获取内核信息 4.1系统请求键 4.2 通过/proc 接口 4.3 通过…

算法:有效的括号(入栈出栈)

时间复杂度 O(n) 空间复杂度 O(n∣Σ∣),其中 Σ 表示字符集,本题中字符串只包含 6 种括号 /*** param {string} s* return {boolean}*/ var isValid function(s) {const map {"(":")","{":"}","["…

List截取指定长度(java截取拼接URL)

场景&#xff1a; N多个参数&#xff0c;截取指定个数&#xff0c;拼接URL public static void main(final String[] args) {int count 0;//每页数量final int pageSize 5;final List<Integer> memberNos ListUtil.toList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13…

python格式化内容

1.字符串格式化: 定义列表 [{"姓名": "张三", "年龄": 18, "性别": "男"}, {"姓名": "里斯李四李斯", "年龄": 18, "性别": "男"}, {"姓名": "斯托夫斯基…

C++知识 抽象基类

抽象基类通常包含至少一个纯虚函数&#xff0c;即一个没有具体实现的虚函数&#xff0c;通过在基类中声明纯虚函数&#xff0c;它强制派生类提供这个函数的具体实现。 通过在类的声明中使用 virtual 关键字和 0 初始化来创建纯虚函数&#xff0c;这样的类就成为抽象基类。以下…

上位机与PLC:ModbusTCP通讯之数据类型转换

前请提要: 从PLC读取的数值,不管是读正负整数还是正负浮点数,读取过来后都会变成UInt16,也就是Ushort类型 一、ushort(UInt16)转成 Int32 源代码方法: //ushort类型转Int32类型的方法private int ushortToInt32(ushort[] date, int start){//先进行判断,长度是否正确…

MySQL_6.MySQL常用创建语句

1.数据库创建,查询,删除 (1)创建一个test数据库 CREATE DATABASE test ; CREATE DATABASE IF NOT EXISTS test; # default character set :默认字符集 CREATE DATABASE IF NOT EXISTS test default character set UTF8; # default collate&#xff1a;默认排序规格 # utf8_g…

前端知识(七)———HTTPS:保护网络通信安全的关键

当谈到网络通信和数据传输时&#xff0c;安全性是一个至关重要的问题。在互联网上&#xff0c;有许多敏感信息需要通过网络进行传输&#xff0c;例如个人身份信息、银行账户信息和商业机密等。为了保护这些信息不被未经授权的人访问和篡改&#xff0c;HTTPS&#xff08;超文本传…

AI:大语言模型LLM

LLM 大语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;是一种利用大量文本数据进行训练的自然语言处理模型&#xff0c;其评价可以从多个方面进行。 以下是一些主要的评价方面&#xff1a; 语言理解和生成能力&#xff1a;评价大语言模型在自然语言理…

模型评价指标

用训练好的模型结果进行预测&#xff0c;需要采用一些评价指标来进行评价&#xff0c;才可以得到最优的模型 常用的指标&#xff1a; 1.分类任务 ConfusionMatrix 混淆矩阵Accuracy 准确率Precision 精确率Recall 召回率F1 score H-mean值ROC Curve ROC曲线PR …

PostgreSQL pgvector:如何利用向量数据库提升搜索效率和精度

LLMs模型实战教程 文章来源&#xff1a;https://zhuanlan.zhihu.com/p/641516393 Kevin 一、介绍 随着基础模型的兴起&#xff0c;向量数据库的受欢迎程度也飙升。事实上&#xff0c;在大型语言模型环境中&#xff0c;向量数据库也很有用。 在机器学习领域&#xff0c;我们经…

天池SQL训练营(三)-复杂查询方法-视图、子查询、函数等

-天池龙珠计划SQL训练营 SQL训练营页面地址&#xff1a;https://tianchi.aliyun.com/specials/promotion/aicampsql 3.1 视图 我们先来看一个查询语句&#xff08;仅做示例&#xff0c;未提供相关数据&#xff09; SELECT stu_name FROM view_students_info;单从表面上看起来…

C#反射加载程序集并使用

具体实现参考&#xff1a; C# 动态加载DLL通过反射调用参数、方法、窗体_c#反射加载dll并传入参数-CSDN博客 C#进阶学习--反射(Reflection) - 知乎 走进C#反射机制 - 知乎 1.使用过程 //创建数据集 Assembly outerAsm Assembly.LoadFile("D:/your.dll");//获取…

rancher harvester deploy demo 【部署 harvester v1.2.1】

简介 Harvester 是一个现代的、开放的、可互操作的、基于Kubernetes的超融合基础设施(HCI)解决方案。它是一种开源替代方案&#xff0c;专为寻求云原生HCI解决方案的运营商而设计。Harvester运行在裸机服务器上&#xff0c;提供集成的虚拟化和分布式存储功能。除了传统的虚拟机…

pgsql存储过程

由于部分企业数据库从aws迁移到腾讯云&#xff0c;导致有一个定时任务&#xff08;从详情表汇总数据到统计表中&#xff09;错过了触发&#xff0c;所以这部分企业的数据需要触发重新刷一下&#xff0c;但是又有规定白天不允许上线&#xff0c;只能把定时任务的逻辑用存储过程&…

SQL SELECT 语句

SELECT 语句用于从数据库中选取数据。 SQL SELECT 语句 SELECT 语句用于从数据库中选取数据。 结果被存储在一个结果表中&#xff0c;称为结果集。 SQL SELECT 语法 SELECT column1, column2, ... FROM table_name; 与 SELECT * FROM table_name; 参数说明&#xff1a; …

五花八门客户问题(BUG) - 用好strace

strace简介 strace是一个用于跟踪系统调用和信号传递的Linux命令,它是一个集诊断、调试、统计于一体的工具。strace可以监控用户空间进程和内核的交互,比如系统调用、信号传递、进程状态变更等。它底层使用内核的ptrace特性来实现其功能。 strace最简单的用法是执行一个指定…

二分查找|双指针:LeetCode:2398.预算内的最多机器人数目

作者推荐 本文涉及的基础知识点 二分查找算法合集 滑动窗口 单调队列&#xff1a;计算最大值时&#xff0c;如果前面的数小&#xff0c;则必定被淘汰&#xff0c;前面的数早出队。 题目 你有 n 个机器人&#xff0c;给你两个下标从 0 开始的整数数组 chargeTimes 和 runnin…

Django回顾7

一.Django缓存 1.缓存介绍 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一次的的后台操作,都会消耗很多的服务端资源,所以必须使用缓存来减轻后端服务器的压力…

算法:最长公共前缀(横向扫描和纵向扫描)

横向扫描 时间复杂度 O(m * n)&#xff0c;空间复杂度O(1) /*** param {string[]} strs* return {string}*/ var longestCommonPrefix function(strs) {// 先把第一个字符串拿出来let str strs[0]// 用 startsWith 检查数组中每个字符串是否以当前字符串为前缀while(!strs.e…