Docker的核心原理四部分之一(基本框架)

docker的核心原理,在大部分人的认知里,主要包括namespace(命名空间),cgroup(Control Groups),镜像分层(UnionFS,也可以用union mount来代称)三部分,再这里我把docker的基本框架也作为核心原理的一部分来进行介绍。
所以,docker的核心原理有:

  1. NameSpace(命名空间);
  2. Cgroup(Control Groups);
  3. 镜像分层(UnionFS);
  4. 基本框架。

首先简单介绍一下前三个部分分别是什么,以及他们在docker中主要用来干什么。
NameSpace:命名空间,又称名称空间。docker使用namespace主要是为了实现轻量级虚拟化服务,通过namespace技术实现了资源的隔离,通过将资源分布在不同的名称空间内实现隔离。从逻辑上来讲,就是在一个大的空间内划分出来多个小的空间,每个空间有自己特定的名称,而我们可以将容器放在不同的空间内,这样就不会与其他的容器进程或者主机的进程出现冲突。
Cgroup:Control Groups,这是一个linux内核的将任意进程进行分组化管理的 管理,将其沿用到了docker中。这个组件帮助docker实现了资源限制的功能,即可以通过设置cgroup来限制每个容器所使用的硬件资源的多少。cgroup是linux内核支持的,默认有许多的资源组,而这些资源组已经可以实现对服务器上大部分资源的限制。
镜像分层:主要使用UnionFS以及COW(Copy On Write,写时复制),docker通过unionfs实现了镜像的分层构建,通过cow机制实现了高效的数据读写
简单来说,docker使用namespace实现了资源隔离,通过cgroup实现了资源限制,通过cow实现了高效的数据读写 。
那么接下来就是关于docker的核心原理中,docker的基本框架是怎样的。
我们结合docker的框架图来理解
Docker是一个C/S架构,分为客户端和服务端。Client端只负责发送请求。Docker Daemon是Docker架构中常驻在后台的系统进程,接受并处理Client发送的请求。
在这里插入图片描述

Docker Daemon的架构,大致可以分为以下三部分:Docker Server、Engine和Job。
Docker Client发送指令到Server端,HTTP/HTTPS接受指令,通过路由与分发调度交给相应的Handler来执行请求。
Engine是Docker架构中的运行引擎,同时也Docker运行的核心模块。它扮演Docker container存储仓库的角色,并且通过执行job的方式来操纵管理这些容器。
在Engine数据结构的设计与实现过程中,有一个handler对象。该handler对象存储的都是关于众多特定job的handler处理访问。
一个Job可以认为是Docker架构中Engine内部最基本的工作执行单元。Docker可以做的每一项工作,都可以抽象为一个job。Server属于engine中的一个特殊的job,属于job的一种。
Job的设计者,把Job设计得与Unix进程相仿。比如说:Job有一个名称,有参数,有环境变量,有标准的输入输出,有错误处理,有返回状态等。
在这里插入图片描述

Graph在Docker架构中扮演已下载容器镜像的保管者,以及已下载容器镜像之间关系的记录者。一方面,Graph存储着本地具有版本信息的文件系统镜像,另一方面也通过GraphDB记录着所有文件系统镜像彼此之间的关系。
GraphDB是一个构建在SQLite之上的小型图数据库,实现了节点的命名以及节点之间关联关系的记录。它仅仅实现了大多数图数据库所拥有的一个小的子集,但是提供了简单的接口表示节点之间的关系。存储了节点之间的关系
Repository存储了具体的镜像文件
同时在Graph的本地目录中,关于每一个的容器镜像,具体存储的信息有:该容器镜像的元数据,容器镜像的大小信息,以及该容器镜像所代表的具体rootfs。

在这里插入图片描述

Driver是Docker架构中的驱动模块。
graphdriver主要用于完成容器镜像的管理,包括存储与获取。
networkdriver的用途是完成Docker容器网络环境的配置,其中包括Docker启动时为Docker环境创建网桥;Docker容器创建时为其创建专属虚拟网卡设备;以及为Docker容器分配IP、端口并与宿主机做端口映射,设置容器防火墙策略等。
execdriver作为Docker容器的执行驱动,负责创建容器运行命名空间,负责容器资源使用的统计与限制,负责容器内部进程的真正运行等。在execdriver的实现过程中,原先可以使用LXC驱动调用LXC的接口,来操纵容器的配置以及生命周期,而现在execdriver默认使用native驱动,不依赖于LXC。
在这里插入图片描述

libcontainer是Docker架构中一个使用Go语言设计实现的库,设计初衷是希望该库可以不依靠任何依赖,直接访问内核中与容器相关的API。
正是由于libcontainer的存在,Docker可以直接调用libcontainer,而最终操纵容器的namespace、cgroups、apparmor、网络设备以及防火墙规则等。这一系列操作的完成都不需要依赖LXC或者其他包。
Docker container(Docker容器)是Docker架构中服务交付的最终体现形式。

通过了解Docker的架构后,就可以理解docker的server端在接收到请求后是如何工作的了。
Client发送请求后,Server通过http接收请求,然后通过路由的分发调度交给handler来进行处理。handler将请求交给engine运行引擎内对应的job,然后job再将其交付给不同的驱动进行执行。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值