【Docker深入浅出】Docker引擎架构介绍

news2024/11/16 1:53:48

文章目录

  • 一. docker引擎介绍
    • 1. Docker daemon:实现Docker API,通过API管理容器
    • 2. containerd:负责容器的生命周期
    • 3. runc:用于创建和启动容器
  • 二. 启动容器的过程
    • 1. 启动过程
    • 2. docker daemon的维护不会影响到运行中的容器
    • 3. shim:让容器独立于docker daemon

一. docker引擎介绍

docker基于OCI的开放标准,引擎采用模块化设计

  • OCI 规范定义了容器镜像的格式,使得不同的工具和平台能够创建、分享和运行容器镜像而不受限于特定的实现。兼容 OCI 镜像格式的系统可以使用标准化的镜像文件进行容器部署。
  • OCI 还定义了容器运行时的规范,确保容器能够在任何支持 OCI 运行时规范的环境中启动和运行。这使得容器的运行不依赖于特定的实现或平台。

 

Docker引擎的组成

Docker引擎由如下主要的组件构成:Docker客户端(Docker Client)​、Docker守护进程(Docker daemon)​、containerd以及runc。它们共同负责容器的创建和运行。如下图:

在这里插入图片描述

 

1. Docker daemon:实现Docker API,通过API管理容器

Docker daemon:

  • Docker daemon实现了Docker API,Docker API 是 Docker 提供的应用编程接口,允许开发者通过编程方式与 Docker 引擎进行交互。
  • Docker daemon中的功能包括但不限于API、镜像管理、身份认证、安全特性、核心网络以及卷。
  • daemon使用一种CRUD风格的API,通过gRPC与containerd进行通信。
Docker API 的作用包括:
1. 容器管理
创建和启动容器:通过 API,可以程序化地创建新的容器并启动它们。例如,
通过 POST /containers/create 和 POST /containers/(id or name)/start。
停止和删除容器:可以通过 POST /containers/(id or name)/stop 停止容器,
通过 DELETE /containers/(id or name) 删除容器。

2. 镜像管理
拉取和推送镜像:可以使用 API 拉取新的镜像(POST /images/create)或将镜像推送到 Docker 仓库(POST /images/(name)/push)。
列出和删除镜像:通过 GET /images/json 列出本地镜像,通过 DELETE /images/(name) 删除镜像。

3. 网络管理
创建和删除网络:可以通过 API 创建新的网络(POST /networks/create)或删除现有网络(DELETE /networks/(id))。
管理网络设置:可以查看网络配置和连接状态(GET /networks/(id))。

4. 卷管理
创建和删除卷:通过 API 可以创建新的数据卷(POST /volumes/create)或删除现有卷(DELETE /volumes/(name))。
查看卷信息:可以获取卷的详细信息(GET /volumes/(name))。

5. 日志和监控
获取容器日志:可以获取特定容器的日志输出(GET /containers/(id or name)/logs),帮助调试和监控容器运行状态。
查看容器状态:通过 GET /containers/(id or name)/json 获取容器的详细状态信息。

6. 系统信息
查看 Docker 版本:通过 GET /version 获取 Docker 引擎的版本信息。
获取系统统计信息:通过 GET /system/df 获取 Docker 使用的磁盘空间统计信息。

7. 安全性和权限
管理访问权限:API 可以用于设置和管理 Docker 引擎的访问权限,控制不同用户或应用的操作权限。


8. 自动化和集成
与 CI/CD 工具集成:Docker API 允许在持续集成和持续部署(CI/CD)流程中自动化容器的构建、测试和部署。
自定义管理工具:开发者可以使用 Docker API 创建自定义的管理界面或工具,以满足特定的业务需求。

 

使用场景

  1. 自动化管理:通过 API 可以编写脚本或程序自动化容器的创建、启动、停止等操作。
  2. 集成和扩展:将 Docker 功能集成到现有的应用程序或系统中,比如在云平台、监控工具或开发环境中。
  3. 自定义应用:构建自定义的用户界面或控制面板,提供更符合业务需求的容器管理功能。

 

2. containerd:负责容器的生命周期

containerd 是 Docker 的一个核心组件,主要用于容器的运行时管理。它负责以下几个方面:

  1. 容器生命周期管理:启动、停止、删除容器。
  2. 容器镜像管理:拉取、存储和管理容器镜像。
  3. 资源管理:管理容器的资源分配和限制。
  4. 日志管理:处理容器的日志输出。

3. runc:用于创建和启动容器

runc是OCI容器运行时规范的参考实现,它使用与OCI兼容的bundle(2?)来启动容器。runc生来只有一个作用——创建容器!

Docker使用runc作为其默认的容器运行时

  • containerd调用runc,并确保Docker镜像以OCI bundle的格式交给runc。
  • runc可以作为独立的CLI工具来创建容器。它基于Libcontainer(3?),也可被其他项目或第三方工具使用。

 

二. 启动容器的过程

下面的docker container run命令会基于alpine:latest镜像启动一个新容器。

$ docker container run --name ctr1 -it alpine:latest sh

1. 启动过程

当使用Docker命令行工具执行如上命令时,

  1. Docker客户端会将其转换为合适的API格式,并发送到正确的API端点(3?)。
  2. 一旦daemon接收到创建新容器的命令,它就会向containerd发出调用。daemon已经不再包含任何创建容器的代码了。
  3. containerd指导runc启动容器:containerd不负责创建容器,而是指挥runc去做。containerd将Docker镜像转换为OCI bundle,并让runc基于此创建一个新的容器。
  4. runc与操作系统内核接口进行通信,基于所有必要的工具(Namespace、CGroup等)来创建容器。容器进程作为runc的子进程启动,启动完毕后,runc将会退出。

现在,容器启动完毕了。如下图容器启动过程:

 

在这里插入图片描述

 

2. docker daemon的维护不会影响到运行中的容器

为什么对于docker daemon的维护和升级不会影响到运行中的容器

因为Docker将所有的用于启动、管理容器的逻辑和代码从daemon中移除,意味着容器运行时与Docker daemon是解耦的,有时称之为“无守护进程的容器(daemonless container)​”​,所以,对Docker daemon的维护和升级工作不会影响到运行中的容器。

在旧模型中,所有容器运行时的逻辑都在daemon中实现,启动和停止daemon会导致宿主机上所有运行中的容器被杀掉。这在生产环境中是一个大问题——想一想新版Docker的发布频次吧!每次daemon的升级都会杀掉宿主机上所有的容器。

 

3. shim:让容器独立于docker daemon

上图展示了shim组件。shim是将运行中的容器与daemon解耦(,以便daemon进行升级等操作)不可或缺的工具。

containerd指挥runc来创建新容器。事实上,每次创建容器时它都会fork一个新的runc实例。不过,一旦容器创建完毕,对应的runc进程就会退出。因此,即使运行上百个容器,也无须保持上百个运行中的runc实例。

 
一旦runc退出,相关联的containerd-shim进程就会成为容器的父进程。作为容器的父进程,shim用于管理容器与容器运行时之间的通信。它主要承担以下功能:

  1. 保持所有STDIN和STDOUT是开启状态,从而当daemon重启的时候,容器不会因为管道(pipe)的关闭而终止;
  2. 容器进程管理:shim 负责启动和管理容器内的主进程,并确保容器进程在后台正确运行。
  3. 日志转发:将容器的标准输出和错误日志转发到 Docker 引擎或日志系统。
  4. 容器终止处理:处理容器的正常或异常退出,并将退出状态报告给 daemon。
  5. 生命周期管理:支持容器的启动、停止、重启等操作,确保容器生命周期的正常管理。

在 Docker 中,shim 的作用是让容器进程独立于 Docker 守护进程,使得容器可以更稳定地运行,同时也提供了更好的隔离和资源管理。

 

 

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

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

相关文章

依靠 VPN 生存——探索 VPN 后利用技术

执行摘要 在这篇博文中,Akamai 研究人员强调了被忽视的 VPN 后利用威胁;也就是说,我们讨论了威胁行为者在入侵 VPN 服务器后可以用来进一步升级入侵的技术。 我们的发现包括影响 Ivanti Connect Secure 和 FortiGate VPN 的几个漏洞。 除了漏洞之外,我们还详细介绍了一组…

C语言试题(含答案解析)

单选 1.下面C程序的运行结果为&#xff08;&#xff09; int main(void) {printf("%d", B < A);return 0; }A.编译错误 B.1 C.0 D.运行错误 A’的ascii码值为65&#xff0c;‘B’的ascii码值为66&#xff0c;‘B’<‘A’是不成立的&#xff0c;返回0&#xf…

spring学习(1)

目录 一、是什么 二、IOC思想 2.1 IOC创建对象的方式 三、Spring的配置 3.1 别名 3.2 Bean的配置 3.3 import 四、DI依赖注入 4.1 构造器注入 4.2 Set方式注入【重点】 4.3 拓展方式注入 五、Bean的自动装配 5.1 byName自动装配 5.2 byType自动装配 5.3 注解实现…

Vue小知识大杂烩

一、Vue组件的三大部分&#xff1a;template、Script、Style template --> 组件的模板结构 写html的地方 注意&#xff1a;<template> 是 vue 提供的容器标签&#xff0c;只起到包裹性质的作用&#xff0c;它不会被渲染为真正的 DOM 元素。 script -> 组件的…

超声波清洗机什么牌子值得入手? 清洁力好的超声波清洗机推荐

对于眼镜佩戴人士而言&#xff0c;超声波清洗机无疑是清洁神器&#xff01;它凭借高频振动技术&#xff0c;能深入眼镜的每一细微处及手洗难以触及的缝隙&#xff0c;有效清除顽固污渍&#xff0c;不仅大幅提高清洁效率&#xff0c;而且清洁质量远胜传统方法。随着超声波清洗机…

Linux下快速搭建七日杀官方私人服务器教程

今天给大家分享一下七日杀的个人开服教程&#xff0c;本教程基于Linux系统开发&#xff0c;推荐有一定基础的小伙伴尝试&#xff01;如果你没有Linux的基础但实在想开的小伙伴可以根据以下教程一步步进行操作&#xff0c;后续这边也会上架对应视频操作 架设前准备&#xff1a; …

Redis篇三:在Ubuntu下安装Redis

文章目录 1. 安装Redis2. 更改Redis的IP3. 使用redis自带的客户端来连接服务器4. Redis的客户端介绍 1. 安装Redis sudo apt install redis2. 更改Redis的IP 刚安装的Redis的ip是一个本地环回的ip&#xff0c;也就是只能由当前主机上的客户端进行访问&#xff0c;跨主机就访问…

IO进程线程 0823作业

作业 创建子父进程&#xff0c;子进程将1.txt内容拷贝到2.txt中&#xff0c;父进程将3.txt内容拷贝到4.txt中。 #include <myhead.h> int main(int argc, const char *argv[]) {pid_t ID;ID fork();if(ID > 0){int fd1;fd1 open("./3.txt",O_RDONLY);if(…

js 键盘监听 组合键

今天分享如何快速实现js快捷键监听 所需环境&#xff1a; 浏览器js 实现目标 mac/win兼容&#xff0c;一套代码&#xff0c;多个平台支持快捷键监听/单按键监听事件是否冒泡可设置使用方式简单快速挂载与卸载4行代码实现组合键监听 代码原理 把键盘监听事件挂载在documen…

c#-DataGridView控件实现分页

有时候我们需要进行分页显示&#xff0c;第一方面是在大数据量下可以降低卡顿&#xff0c;另一方面也是方便查找。 首先划重点&#xff0c;如果卡顿&#xff0c;不要用单元格填充的方式去刷新&#xff0c;用绑定数据源的方式比较高效&#xff01; 下面重点讲如何使用数据源绑定…

正式收官!阿里云携手优酷,用AI重塑影视IP创新边界

影视行业的新一轮创作风潮&#xff0c;将由AI掀起。 GPT和Sora等先进AI模型的出现&#xff0c;带动影视行业进入一场前所未有的创意变革。当前&#xff0c;在角色创作、脚本生成、营销策略等方面&#xff0c;AI已经展现了强大的潜力。而作为影视创作的“灵魂”&#xff0c;影视…

重新审视 ChatGPT 和 Elasticsearch:RAG 真正将应用程序紧密结合在一起

作者&#xff1a;来自 Elastic Jeff Vestal 关注博客 ChatGPT 和 Elasticsearch&#xff1a;OpenAI 遇到私人数据。 在此博客中&#xff0c;你将了解如何&#xff1a; 创建 Elasticsearch Serverless 项目创建推理端点以使用 ELSER 生成嵌入使用语义文本字段进行自动分块并调…

SpringBoot如何进行全局异常处理?

1.为什么需要全局异常处理&#xff1f; 在日常开发中&#xff0c;为了不抛出异常堆栈信息给前端页面&#xff0c;每次编写Controller层代码都要尽可能的catch住所有service层、dao层等异常&#xff0c;代码耦合性较高&#xff0c;且不美观&#xff0c;不利于后期维护。 应用场…

基于java的少儿编程网上报名系统+vue

TOC ssm006基于java的少儿编程网上报名系统vue 研究背景 近年来&#xff0c;随着网络技术的不断发展&#xff0c;越来越多人在网站查询各种信息&#xff0c;少儿编程网上报名系统对用户和管理员都有很大帮助&#xff0c;少儿编程网上报名系统通过和数据库管理系软件协作来实…

基于STM32开发的智能安防报警系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 系统初始化传感器数据采集与处理报警控制与通知Wi-Fi通信与远程监控应用场景 家庭安防管理商铺和办公室的智能安防常见问题及解决方案 常见问题解决方案结论 1. 引言 随着智能家居和物联网技…

拟合的置信区间

目标图: 图片来源:Fig. 4e from Arwani, Ruth Theresia, et al. "Stretchable ionic–electronic bilayer hydrogel electronics enable in situ detection of solid-state epidermal biomarkers." Nature Materials (2024): 1-8. 1. 数据输入 假设原始数据如下:…

书生大模型实战营第三期基础岛第二课——8G 显存玩转书生大模型 Demo

8G 显存玩转书生大模型 Demo 基础任务进阶作业一&#xff1a;进阶作业二&#xff1a; 基础任务 使用 Cli Demo 完成 InternLM2-Chat-1.8B 模型的部署&#xff0c;并生成 300 字小故事&#xff0c;记录复现过程并截图。 创建conda环境 # 创建环境 conda create -n demo pytho…

协作新选择:即时白板在线白板软件分享

在团队合作中&#xff0c;产品经理扮演着至关重要的角色&#xff0c;他们不仅是产品与用户之间的纽带&#xff0c;更是产品性能和用户需求的桥梁。他们需要深入参与产品的研发过程&#xff0c;并与研发团队保持紧密的沟通。因此&#xff0c;产品经理需要一款高效的协作工具来提…

纯电SUV挑花眼了?看看这两款十多万的家用SUV谁更香

文/王俣祺 导语&#xff1a;随着新能源技术的日益成熟&#xff0c;现如今纯电汽车已经在市场上卖得风生水起。早些时候人们可能还会对纯电汽车抱有“续航焦虑”&#xff0c;但随着各个车型在电池容量以及能耗方面都迎来了进步&#xff0c;充电网络也日渐完善&#xff0c;选择一…

多商户多套部署需修改注意事项

同一台服务器上部署多个多商户项目&#xff0c;需要修改和调整的地方等。 一、修改代码中的端口号&#xff0c;需要两个项目不能使用同一个端口号&#xff0c;例如&#xff1a;A项目用&#xff1a;8324&#xff0c;B项目用&#xff1a;8325&#xff1b; 二、修改反向代理&…