首页 > 其他分享 >Docker引擎架构

Docker引擎架构

时间:2023-11-08 16:44:09浏览次数:39  
标签:容器 daemon 架构 containerd runc 引擎 镜像 Docker

Docker引擎架构

1. Docker引擎的发展

1.1 Docker引擎首次发布时

Docker首次发布时,Docker引擎由两个核心组件组成:LXC和Docker daemon

image-20231108105413912

Docker daemon是单一的二进制文件,包含诸如Docker客户端、Docker API、容器运行时、镜像构建等。

LXC提供对诸如命名空间(Namespace)和控制组(CGroup)等基础工具的操作能力,他是基于Linux内核的容器虚拟化技术。

1.2 首次发布Docker引擎存在的问题

首先,LXC是基于Linux的。这对于一个立志于跨平台的项目来说是个问题。

其次,如此核心的组件依赖于外部工具,这会给项目带来巨大的风险,甚至影响其发展。

因此,Docker公司开发了名为Libcontainer的自研工具,用于替代LXC。Libcontainer的目标是成为平台无关的工具,可基于不同的内核为Docker上层提供必要的容器交互功能。

1.3 现有的Docker引擎

image-20231108111849610

runc:基于OCI实现,只有一个作用--创建容器

containerd:对Docker daemon进行拆解后,所有容器执行逻辑被重构到一个新的名为containerd(container-dee)的工具中。它的主要任务是容器的生命周期管理---start | stop | pause | rm ...

docker daemon:主要功能包括镜像管理、镜像构建、REST API、身份验证、安全、核心网络以及编排,不再包含任何创建容器的代码。

shim:runc创建容器完毕,对应的runc进程就会退出,相关联的containerd-shim进程就会成为容器的父进程。shim是实现无daemon的容器不可或缺的工具。

1.4 容器启动过程

image-20231108114444784

Docker client向Docker daemon发送创建容器的命令,Docker daemon一旦接收到创建新容器的命令,它就会向containerd发出调用,虽然名叫containerd,但是它并不负责创建容器,二十指挥runc去做。containerd将Docker镜像转换为OCI bundle,并让runc基于此创建一个新的容器。

runc与操作系统内核接口进行通信,基于所有必要工具(Namespace、CGroup等)来创建容器。容器进程作为runc的子进程,启动完毕后,runc将会退出。相关联的containerd-shim进程成为容器的父进程。

该模型的优势:

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

1.5 关于OCI

OCI(open container Initiative)开放容器倡议,定义了两个规范:

  • 镜像规范
  • 容器运行时规范

2. 关于k8s 1.24版本弃用dockershim的问题

img

k8s的CRI(Container Runtime Interface)与docker引擎的API并不兼容,为了支持Docker,在kubelet和Docker之间增加了一个适配器(dockershim)。

在k8s 1.24版本完全弃用了dockershim,kubelet直接与containerd通信,管理容器的生命周期,去掉了 dockershim 和 Docker Engine 这两个环节,更加简洁明了,性能更好。

弃用dockershim对K8s和Docker的影响不大,因为docker引擎也是通过containerd进行容器生命周期管理,原有的Docker镜像和容器仍然可以正常运行。唯一的变化是K8s绕过了docker,直接调用containerd。

K8s直接使用containerd来操作容器,那么它就是一个独立于Docker的工作环境,两者都无法访问对方管理的容器和镜像。换句话说,使用docker ps命令将不会看到K8s中运行的容器。

由于容器镜像格式已经标准化(OCI规范,Open Container Initiative),Docker镜像在K8s中仍然可以正常使用,不需要改变原有的开发测试和CI/CD流程。我们仍然可以拉取 Docker Hub,或者编写一个 Dockerfile 来打包应用程序。

3. 参考

《深入浅出Docker》第五章

https://zhuanlan.zhihu.com/p/572907451

标签:容器,daemon,架构,containerd,runc,引擎,镜像,Docker
From: https://www.cnblogs.com/lichengmin/p/17817752.html

相关文章

  • 流式数据库引擎备受关注,亚信安慧AntDB数据库受邀参加“2023中国PostgreSQL数据库生态
    11月3日至5日,2023中国PostgreSQL数据库生态大会在北京中科院软件所大报告厅盛大召开,大会现场百余位专家学者、企业、用户代表及线上数千位观众,就近年来国产数据库技术与市场变革进行深入探讨。湖南亚信安慧科技有限公司(简称:亚信安慧)受邀参与主论坛发表了重要演讲,并荣膺“2023最佳......
  • Docker容器间的网络设置
    1、构建自定义docker网络dockernetworkcreate-dbridgedocker_Net#其中,-d指定了docker的网络类型为bridge类型,并自定义docker网络的名称为docker_Net创建成功后,用dockernetworkls查看系统的docker网络: 2、创建docker容器dockerrun-it--rm\--namebusybox_2\......
  • 【文档翻译】构建一个引擎插件系统
    本文档译自bitsquid引擎开发博客文章"BuildinganEnginePluginSystem",作者NiklasFrykholm,原文参见此处概述-Overview插件系统是开发者扩展引擎能力的一个好方法。当然,引擎也可以直接通过修改源代码来进行扩展,但是这种方法有几个缺点:更改代码需要重新编译引擎。任何......
  • Unity架构师必备的开源库,让你3天搭建商用游戏框架
    现在Unity的相关技术已经都非常常熟了,如果你的技术能力与阅历够,搭建一个商用的游戏框架,你只需要3天的时间。今天给大家分享一个Unity老鸟3天能搭建一个自己的商用框架的几个必备的开源库,方便大家学习与使用,同时学习这些有前途的开源库也能让你在公司里面游刃有余。 1:搭建商用......
  • B/S架构医院HIS绩效考核系统源码
    医院HIS绩效考核系统是一种以人力资源管理为基础,选用适合医院组织机构属性的绩效理论和方法,基于医院管理目标,构建全方位的绩效考评体系,在科学、合理的绩效管理体系基础上,采用科学管理的方法,如平衡计分卡的管理理念与方法,选取关键指标,对目标的执行进行管理、考核、分析、评价,最终结......
  • 全球发布|首个AI视角下的生态系统架构解读—《生态系统架构--人工智能时代从业者的新思
    点击可免费注册下载......
  • MySQL的存储引擎、事务补充、MySQL的锁机制、MySQL的日志
    MySQL的存储引擎概述数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。MySQL的核心就是存储引擎。用户可......
  • docker日志收集docker插件+loki+grafna
    实现收集docker容器日志方式:dokcer安装插件,将日志发送到loki,grafna展示日志。1、安装lokiwgethttps://raw.githubusercontent.com/grafana/loki/v2.9.1/cmd/loki/loki-local-config.yaml-Oloki-config.yamldockerrun--nameloki-d-v$(pwd):/mnt/config-p3100:3100......
  • 一文带你认识「Docker」与「k8s」
    转载:https://juejin.cn/post/7015729458959089701随着k8s作为容器编排解决方案变得越来越流行,有些人开始拿Docker和k8s进行对比,不禁问道:Docker不香吗?k8s是kubernetes的缩写,'8'代表中间的八个字符。其实Docker和k8s并非直接的竞争对手,它俩相互依存。Docker是......
  • JAVA开发(JAVA架构师成长之路)
    从一个最基础的JAVA开发人员成为JAVA架构师,需要经历8层能力的进阶。第一阶段:熟悉JAVA基础语法,学会写各种ifelse和流程语句,熟练使用各种数据类型,集合。能依葫芦画瓢,模仿别人的代码结构,新增类,修改类的信息和逻辑。这个阶段大概是一年的经验。第二阶段:熟悉使用各种开源组件,比如知......