回复 1024 有特别礼包

来源:t.cn/RdiV7Sn | 作者:胡伟煌

上一篇:最全最强解析:支付宝系统架构内部剖析(架构图)

01 Docker 的总体架构

Docker 是一个 C/S 模式的架构,后端是一个松耦合架构,模块各司其职。下图是它的总体架构图:

1 用户是使用 Docker Client 与 Docker Daemon 建立通信,并发送请求给后者。

2 Docker Daemon 作为 Docker 架构中的主体部分,首先提供 Docker Server 的功能使其可以接受 Docker Client 的请求。

3 Docker Engine 执行 Docker 内部的一系列工作,每一项工作都是以一个 Job 的形式的存在。

4 Job 的运行过程中,当需要容器镜像时,则从 Docker Registry 中下载镜像,并通过镜像管理驱动 Graphdriver 将下载镜像以 Graph 的形式存储。

5 当需要为 Docker 创建网络环境时,通过网络管理驱动 Networkdriver 创建并配置 Docker容器网络环境。

6 当需要限制 Docker 容器运行资源或执行用户指令等操作时,则通过 Execdriver 来完成。

7 Libcontainer 是一项独立的容器管理包,Networkdriver 以及 Execdriver 都是通过 Libcontainer 来实现具体对容器进行的操作。

02 Docker 各模块组件分析

2.1 Docker Client「发起请求」

1 Docker Client 是 和 Docker Daemon 建立通信的客户端。用户使用的可执行文件为 docker(一个命令行可执行文件),docker 命令使用后接参数的形式来实现一个完整的请求命令(例如:docker images,docker 为命令不可变,images 为参数可变)。

2 Docker Client 可以通过以下三种方式和 Docker Daemon 建立通信:tcp://host:port、unix://pathtosocket 和 fd://socketfd

3 Docker Client 发送容器管理请求后,由 Docker Daemon 接受并处理请求,当 Docker Client 接收到返回的请求相应并简单处理后,Docker Client 一次完整的生命周期就结束了。(一次完整的请求:发送请求→处理请求→返回结果),与传统的 C/S 架构请求流程并无不同。

2.2 Docker Daemon(后台守护进程)

Docker daemon 架构图

Docker Server 架构图

1 Docker Server 相当于 C/S 架构的服务端。功能为接受并调度分发 Docker Client 发送的请求。接受请求后,Docker Server 通过路由与分发调度,找到相应的 Handler 来执行请求。

2 在 Docker 的启动过程中,通过包 gorilla/mux 创建了一个 mux.Router 来提供请求的路由功能。在 Golang 中 gorilla/mux 是一个强大的 URL 路由器以及调度分发器。该 mux.Router 中添加了众多的路由项,每一个路由项由 HTTP 请求方法(PUT、POST、GET 或DELETE)、URL、Handler 三部分组成。

3 创建完 mux.Router 之后,Docker 将 Server 的监听地址以及 mux.Router 作为参数来创建一个 httpSrv=http.Server{},最终执行 httpSrv.Serve() 为请求服务。

4 在 Docker Server 的服务过程中,Docker Server 在 listener 上接受 Docker Client 的访问请求,并创建一个全新的 goroutine 来服务该请求。在 goroutine 中,首先读取请求内容并做解析工作,接着找到相应的路由项并调用相应的 Handler 来处理该请求,最后 Handler 处理完请求之后回复该请求。

2.3 Docker Engine

5 Docker Engine 是 Docker 架构中的运行引擎,同时也 Docker 运行的核心模块。它扮演 Docker Container 存储仓库的角色,并且通过执行 Job 的方式来操纵管理这些容器。

6 在 Docker Engine 数据结构的设计与实现过程中,有一个 Handler 对象。该 Handler 对象存储的都是关于众多特定 Job 的 Handler 处理访问。举例说明: Docker Engine 的Handler 对象中有一项为:{“create”: daemon.ContainerCreate,},则说明当名为”create” 的 Job 在运行时,执行的是 daemon.ContainerCreate 的 Handler。

Job

1 一个 Job 可以认为是 Docker 架构中 Docker Engine 内部最基本的工作执行单元。Docker 可以做的每一项工作,都可以抽象为一个 Job。例如:在容器内部运行一个进程,这是一个 Job;创建一个新的容器,这是一个 Job。 Docker Server 的运行过程也是一个 Job,名为 ServeApi。

2 Job 的设计者,把 Job 设计得与 Unix 进程相仿。比如说:Job 有一个名称、有参数、有环境变量、有标准的输入输出、有错误处理,有返回状态等。

2.4 Docker Registry(镜像注册中心)

1 Docker Registry 是一个存储容器镜像的仓库(注册中心),可理解为云端镜像仓库。按 Repository 来分类,docker pull 按照 [repository]:[tag] 来精确定义一个具体的 Image。

2 在 Docker 的运行过程中,Docker Daemon 会与 Docker Registry 通信,并实现搜索镜像、下载镜像、上传镜像三个功能,这三个功能对应的 Job 名称分别为: “search”、”pull” 与 “push”。

3 Docker Registry 可分为公有仓库( Docker Hub)和私有仓库。

2.5 Graph 「Docker 内部数据库」

Graph 架构图

Repository

1 已下载镜像的保管者(包括下载的镜像和通过 Dockerfile 构建的镜像)。

搜索公众号顶级架构师回复关键字“架构整洁”,获取一份惊喜礼包。

2 一个 Repository 表示某类镜像的仓库(例如:Ubuntu),同一个 Repository 内的镜像用 Tag 来区分(表示同一类镜像的不同标签或版本)。一个 Registry 包含多个Repository,一个 Repository 包含同类型的多个 Image。

3 镜像的存储类型有 Aufs、Devicemapper、Btrfs、Vfs等。其中 CentOS 系统 7.x 以下版本使用 Devicemapper 的存储类型。

4 同时在 Graph 的本地目录中存储有关于每一个的容器镜像具体信息,包含有:该容器镜像的元数据、容器镜像的大小信息、以及该容器镜像所代表的具体 rootfs。

GraphDB

1 已下载容器镜像之间关系的记录者。

2 GraphDB 是一个构建在 SQLite 之上的小型数据库,实现了节点的命名以及节点之间关联关系的记录。

2.6 Driver 「执行部分」

Driver 是 Docker 架构中的驱动模块。通过 Driver 驱动,Docker 可以实现对 Docker 容器执行环境的定制。即 Graph 负责镜像的存储,Driver 负责容器的执行。

Graphdriver

Graphdriver 架构图

1 Graphdriver 主要用于完成容器镜像的管理,包括存储与获取。

2 存储:docker pull 下载的镜像由 Graphdriver 存储到本地的指定目录( Graph 中 )。

3 获取:docker run(create)用镜像来创建容器的时候由 Graphdriver 到本地 Graph中获取镜像。

Networkdriver

Networkdriver 架构图

Networkdriver 的用途是完成 Docker 容器网络环境的配置,其中包括:

  • Docker 启动时为 Docker 环境创建网桥。

  • Docker 容器创建时为其创建专属虚拟网卡设备。

  • Docker 容器分配IP、端口并与宿主机做端口映射,设置容器防火墙策略等。

Execdriver

Execdriver 架构图

1 Execdriver 作为 Docker 容器的执行驱动,负责创建容器运行命名空间、容器资源使用的统计与限制、容器内部进程的真正运行等。

2 现在 Execdriver 默认使用 Native 驱动,不依赖于 LXC。

2.7 Libcontainer 「函数库」

Libcontainer 架构图

1 Libcontainer 是 Docker 架构中一个使用 Go 语言设计实现的库,设计初衷是希望该库可以不依靠任何依赖,直接访问内核中与容器相关的 API。

2 Docker 可以直接调用 Libcontainer 来操纵容器的 Namespace、Cgroups、Apparmor、网络设备以及防火墙规则等。

3 Libcontainer 提供了一整套标准的接口来满足上层对容器管理的需求。或者说 Libcontainer 屏蔽了 Docker 上层对容器的直接管理。

2.8 Docker Container 「服务交付的最终形式」

Docker Container 架构

1 Docker Container( Docker 容器 )是 Docker 架构中服务交付的最终体现形式。

2 Docker 按照用户的需求与指令,订制相应的 Docker 容器:

  • 用户通过指定容器镜像,使得 Docker 容器可以自定义 rootfs 等文件系统。

  • 用户通过指定计算资源的配额,使得 Docker 容器使用指定的计算资源。

  • 用户通过配置网络及其安全策略,使得 Docker 容器拥有独立且安全的网络环境。

  • 用户通过指定运行的命令,使得 Docker 容器执行指定的工作。

附:本文在《docker源码分析》基础上进行整理。

PS:如果觉得我的分享不错,欢迎大家随手点赞、在看。

大家一起在评论区聊聊呗~

公众号后台回复 架构 或者 架构整洁 有惊喜礼包!顶级架构师交流群

 「顶级架构师」建立了读者架构师交流群,大家可以添加小编微信进行加群。欢迎有想法、乐于分享的架构师们一起交流学习。

扫描添加好友邀你进架构师群,加我时注明姓名+公司+职位】

版权申明:内容来源网络,版权归原作者所有。如有侵权烦请告知,我们会立即删除并表示歉意。谢谢。

猜你还想看

总成交额达 4982 亿!蒋凡总结发言,阿里解秘双 11 背后技术
Spring Boot + Vue 如此强大?竟然可以开发基于 C/S 架构的应用
技术鄙视链绝对客观排行榜,网友:运维哭晕在厕所
火币网交易所架构演进

架构图解_图解 Docker 架构相关推荐

  1. python微服务架构设计模式_微服务架构设计模式 PDF 电子书 百度云 网盘下载

    你还没有注册,无法下载本站所有资源,请立即注册! 您需要 登录 才可以下载或查看,没有帐号?立即注册 x java自学网(http://www.137zw.com)-java论坛,java电子书推荐: ...

  2. avl删除根节点图解_图解 6 种树,你心中有数吗。。。

    数据结构这门课程是计算机相关专业的基础课,数据结构指的是数据在计算机中的存储.组织方式. 我们在学习数据结构时候,会遇到各种各样的基础数据结构,比如堆栈.队列.数组.链表.树...这些基本的数据结构类 ...

  3. 三次握手和四次挥手图解_图解 TCP 三次握手和四次挥手

    人到中年,难免长胖发福. 大家好,我是你们有点严肃的胖福(hu), 这里我们聊学习和工作. - 内容提要 - TCP 有 6 种标示:SYN(建立联机) ACK(确认) PSH(传送) FIN(结束) ...

  4. mysql 三层架构开发_从三层架构迈向领域驱动设计(转载)

    三层架构 严格分层架构模式的特点是上层只能访问相邻的下层,其他层次间的调用都不允许.三层架构就是一种严格分层模式,它把职责划分为界面展示.业务逻辑.数据访问三层,还有一个业务实体,前面三层都要依赖它, ...

  5. java bs架构书_基于BS架构的图书借阅管理模块的分析与设计(JSP+MySQL)(新品)

    基于BS架构的图书借阅管理模块的分析与设计(JSP+MySQL)(新品) 来源:2BYSJ.cn 资料编号:2SJ295500 资料等级:★★★★★ %D7%CA%C1%CF%B1%E0%BA%C5% ...

  6. rsatool使用步骤图解_图解360系统重装大师如何使用

    电脑使用久了就会出现这样或那样的问题,比如运行卡顿,浏览速度下降的现象,该怎么办呢?实际上只要借助重装软件,就可以轻松解决电脑卡顿的问题了.那要怎么使用360系统重装大师呢?今天,小编给大家带来了36 ...

  7. python计算图解_图解NumPy,看这一篇就够了!

    晓查 编译整理 量子位 报道 | 公众号 QbitAI NumPy是Python的最重要的扩展程序库之一,也是入门机器学习编程的必备工具.然而对初学者来说,NumPy的大量运算方法非常难记. 最近,国 ...

  8. 华硕vm510l拆电池图解_图解说设备:凯斯CX80C你会买吗?

    [第一工程机械网 原创]图解说设备,我用图说话,你用感受回答!欢迎收看这一期的图解说设备.上一期聊了一款小松的矿山挖掘机,这一期我们来到城镇和农村,说说小挖的故事. 农村街道 根据中国工程机械工业协会 ...

  9. java对象底层原存储结构图解_图解图库JanusGraph系列-一文知晓“图数据“底层存储结构...

    大家好,我是洋仔,JanusGraph图解系列文章,实时更新~ 图数据库文章总目录: 转载文章请保留以下声明: 一:存储模式 留言或私信我,邀请你加入"图数据库交流"微信群! 1. ...

  10. python 自动运维架构师_运维架构师-Python 自动化运维开发-013

    *运维架构师-Python 自动化运维开发-013 5.常用快捷键(附加课余研究) 1.Ctrl + Enter:在下方新建行但不移动光标: 2.Shift + Enter:在下方新建行并移到新行行首 ...

最新文章

  1. BZOJ 2132 圈地计划(最小割)【BZOJ 修复工程】
  2. virus.win32.parite.H病毒的查杀方法
  3. python小程序-【Python精华】100个Python练手小程序
  4. 利用java实现android项目结构API文档
  5. GC算法-分代垃圾回收
  6. 安卓应用安全指南 4.4.2 创建/使用服务 规则书
  7. obd协议 混动车_最新人工智能驾考系统OBD信号采集模块
  8. C# Cron表达式解析 .net 项目文件
  9. XSS fuzzing 工具
  10. 统计学怎么求加权指数_统计学课程作业(统计指数)
  11. 代理模式(自己实现源码)
  12. 百度竞价该如何选择关键词?
  13. linux脚本echo off,echo什么意思_@echo off的作用 - 编程语言及工具 - 电子发烧友网
  14. Arcmap地理配准png
  15. docker 导出本地所有镜像,带仓库和tag值导出到tar.gz文件
  16. OneNote快捷键大全
  17. #小程序# 如何解决video视频在ios里出现黑屏?
  18. C# delegate 详解
  19. FLYMCU芯片超时无应答的另一种解法
  20. PNG图片隐写IDAT分析(3)

热门文章

  1. java如何实现对word设置只读或者加密
  2. js实现手机摇一摇以及震动功能
  3. 在梦想的道路上,一路前行
  4. 转载《由于这台计算机没有远程桌面客户端访问许可证,远程会话被中断》的解决方案
  5. 怎么看懂晦涩难懂的书
  6. 关于APP界面布局设计的八种优缺点
  7. CTFWeb——Bugku秋名山老司机 详细题解
  8. List集合在遍历时删除数据的问题
  9. 丁火生于未月命理分析_日主丁、未月出生五行喜用分析-丁日未月生《晶灵八字算命》...
  10. 哈尔滨计算机毛校长国二,【实验视角】静待紫冰花开 知行合一 且行且知 ——记哈尔滨市实验学校校长王媛参加第二届中国阳明心学高峰论坛...