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 Engine5 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_/article/details/71308236
版权声明:本文为CSDN博主「胡伟煌」的原创文章,遵照CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
近期热文保举:
1.1,000+ 道 Java面试题及谜底整理(2022最新版)
2.劲爆!Java 协程要来了。。。
3.Spring Boot 2.x 教程,太全了!
4.别再写满屏的爆爆爆炸类了,尝尝粉饰器形式,那才是文雅的体例!!
5.《Java开发手册(嵩山版)》最新发布,速速下载!
觉得不错,别忘了随手点赞+转发哦!















还没有评论,来说两句吧...