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源码剖析》根底上进行整顿。

原文链接:https://blog.csdn.net/huwh_/a...

版权申明:本文为CSDN博主「胡伟煌」的原创文章,遵循CC 4.0 BY-SA版权协定,转载请附上原文出处链接及本申明。

近期热文举荐:

1.1,000+ 道 Java面试题及答案整顿(2022最新版)

2.劲爆!Java 协程要来了。。。

3.Spring Boot 2.x 教程,太全了!

4.别再写满屏的爆爆爆炸类了,试试装璜器模式,这才是优雅的形式!!

5.《Java开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞+转发哦!