Docker技术底层架构剖析
[Docker 底层技术]
docker底层的 2 个核心技术分别是 Namespaces 和 Control groups
在操作系统中,网络配置,进程,用户,IPC(进程之间的调用)等信息之间的操作,都是可以被所有进程查看到的,除了这些资源信息,我们还需要隔离进程之间能够共享的信息,而Namespaces用于实现进程之间信息隔离的
关于Linux命名空间,实现进程间信息的独立与隔离需要在操作系统内核层面进行实现的
Mount Namespaces:挂载命名空间,用于隔离挂载目录
为什么要通过Mount namespace隔离挂载目录?
如果说隔离在某个namespace中的程序,可所挂载的目录进行修改,那么另一个nemaspace中运行的程序也能察觉到,这样就在无形之中影响了其他Namespace中程序的运行,显然达不达这样的隔离效果;
所以要进行程序之间的隔离,
首先是要把程序所使用的挂载目录进行隔离,让不同的Nemaspaces拥有独立挂载结构,而程序对挂载信息的修改,也不会影响到其他的namespace中程序的运行; UTS Namespaces:UTS命名空间,用于隔离主机及网络域等信息
通过UTS命名空间,可以为不同的Namespaces设置不同的主机名和网络域 能够简单的将程序隔离到一个独立的网络命名空间 IPC Namespaces:用于隔离进程之间的调用,也就是隔离进程之间的通信;
主要针对系统信号量,消息队列以及共享内存;但是需要注意的是,IPC对于需要进行进程之间通信的程序,只能与同一个命名空间进行通信,无法做到不同命名空间进行信息交换通信; PID Namespaces:进程命名空间,用于隔离进程的运行信息
进程是程序运行最直接的体现方式,要实现进程隔离,将进程信息进行隔离是必须的,为了最大的节约转换的损耗,每一个运行在Namespaces中的进程,其实就真是的运行在Linux系统中,我们虽然可以在宿主机中找到Namespaces隔离
的进程信息,但是namespaces中的PID与宿主机系统中你那个的进程PID并不相同,这也就是得益于PIDNamespaces实现的进程信息的隔离,PID Namespaces为命名空间设置了一个独立的进程管理栈,其中就包括了独立的进程号管理
,每个运行在Namespaces中的进程,会分配到一个属于这个命名空间 Network Namespaces:网络命名空间,用于隔离网络配置和访问 User Namespace:用于隔离用户和用户组信息
通过专门的用户隔离机制,防止运行在Namespaces中的程序直接操作宿主机系统中的用户,以避免影响其他Namespaces中的运行程序;
有了以上 6 种 NameSpaces 从进程、网络、IPC、文件系统、UTS和用户角度的隔离,一个 container 就可以对外展现出一个独立计算机的能力,并且不同 container 从 OS 层面实现了隔离。然而不同 namespace 之间资源还是相互竞争的,仍然需要类似ulimit来管理每个 container 所能使用的资源 - -cgroup。
cgroups(Control groups)实现了对资源的配额和度量。
【控制组】
关于Linux控制组也就是Cgroups(控制组群),其作用于是记录,限制,隔离进程所使用的CPU,内存,文件IO等计算机资源; cgroups通过插入程序对计算机硬件 资源调用的过程,实现了控制进程使用资源目的,作为 容器的两大关键技术,Namespaces主要实现了进程信息,用户,挂载目录,网络配置等软件资源的隔离,
而Cgroups实现呃对CPU,内存,文件IO等硬件资源的控制; PS:通过Namespaces来实现不同容器中进程之间隔离,相互之间不能访问,但是如果缺少cgroups对硬件资源的控制,就是避免不了容器中的程序对资源抢占,从而影响其他容器中程序的运行 Cgroups的组成 从功能层面来说: #Resource Limiting:资源限制。Cgroups能够成为每一个控制组设置使用资源的上限,一旦此类控制分配的资源达到了上线,既不会再分配过多的资源给这个控制组 #Prioritization:优先级分配,Cgroups可以为不同的控制组设置不同的优先级,优先级较高的控制组,可以优先得到Cgroups为其分配的计算机资源 #Accounting:资源统计。对于每个控制组,cgroups都能掌握它们对资源的使用情况,如CPU的使用时长,内存消耗,句柄数等
#Control:进程控制,Cgroups还能对控制组中的进程进行挂起,恢复等操作 Cgroups以下几个重要的组成结构 Task:任务。分配计算机资源就是为了执行特定的任务, Cgroup:控制组,由任务组成的任务组成为控制组,在cgroups中,控制组是分配和控制资源分配的单位 Subsystem:子系统,也就是资源调度的控制器。 Hierachy:继承树,用于处理控制组和子系统的关系。能够将控制组制成树状关系,并让子系统依附到对应的内存子系统中
【容器与控制组】
CGroup主要能够从blikio(块设备IO控制)cpu(CPU使用限制),cpuacct(CPU资源报告),cpuset(多核CPU核心使用控制),devices(设备访问控制),freezer(进程挂起控制),memory(内存使用控制),net_cls(网络控制)和ns(名称空间子系统)等方面限制计算机资源的使用
【联合文件系统】
UFS是联合文件系统的简称,所谓的联合文件系统,就是能够多个目录挂载成同一个文件系统换句话说就是将多个目录挂载成同一个目录,主要特点就是能够从不同的文件系统里将文件挂载到虚拟的联合文件 系统中,还能够把多个目录挂载合并成同一个目录
Docker利用UFS实现镜像技术,,是docker容器技术够被广泛使用的一个杀手锏。UFS制成的镜像大幅度缩小了占用空间,并且能够以分拆的方式在镜像之间共享数据。特别是对于镜像的更新,docker能够在不修改原有的镜像同时,以最小的空间消耗对存储文件的修改
【Docker Engine架构】
我们把docker Engine中所包含的提供doker容器支持的服务程序被dockr daemon。把能够操作docker Engine的客户端成为docker CLI。
docker daemon与docker cli之间是通过docker API进行通信的,也就是说,通过 Docker CLI下达指令,Docker CLI转换为对应的Docker API后,被提交到docker daemon;其实他们两者的关系是非常松散的,不相互依存。Docker CLI既可以直接通过 进程间的通信方式与本机的Docker Daemon连接。也可以通过socket向其他机器上的docker daemon下达操作指令,甚至能够同时操作多个docker daemon;
#Docker Daemon:是实现docker核心程序,管理包括镜像,容器,网络,数据卷 等在内的所有docker组成的模块;docker daemon使用的是linux进程通信接口,且只允许本地的根用户访问。所以需要在root环境操作,执行docker cli提供的docker命令,如果想让docker daemon监听选定的网络地址。可以通过dockerd命令,配合-H或者--host参数,给出监听的网络地址
dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:9876
#Docker CLI其实就是在终端命令行中使用的docker程序,能够将下达的命令行指令转换为docker API请求,在发送到与之关联的docker daemon中
docker CLI工作流程:
每个操作指令与docker daemon相关,首先docker CLI根据指令的类型转换为对应的docker API请求,然后docker CLI请求与之关联的docker Daemon并等待处理结果,docker daemon收到请求操作指令之后,会根据指令内容进行操作,并将结果返回给docekr CLI,docker CLI收到docker daemon返回结果后,会解析结果中的数据,并打印到终端上;
dockerd -H tcp://127.0.0.1:9876 version
Docker技术底层架构剖析的更多相关文章
- Docker 基础底层架构浅谈
docker学习过程中,免不了需要学习下docker的底层技术,今天我们来记录下docker的底层架构吧! 从上图我们可以看到,docker依赖于linux内核的三个基本技术:namespaces.C ...
- Docker技术浅谈:私有化部署的优势以及在顶象内部的应用实践
顶象全景式业务安全风控体系基于新一代风控体系构建,并采用Docker技术进行私有云和公有云部署.本文主要和大家分享下Docker容器技术和顶象风控系统私有化部署的优势以及Docker容器技术在顶象内部 ...
- 《Netty5.0架构剖析和源码解读》【PDF】下载
<Netty5.0架构剖析和源码解读>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062545 内容简介 Netty 是个异步的 ...
- MySQL底层索引剖析
1:Mysql索引是什么 mysql索引: 是一种帮助mysql高效的获取数据的数据结构,这些数据结构以某种方式引用数据,这种结构就是索引.可简单理解为排好序的快速查找数据结构.如果要查“mysql” ...
- Anders Hejlsberg 技术理想架构开发传奇
Anders Hejlsberg(安德斯-海森博格) 坐在自己的办公室,双眼直直的盯着前方.他要做一个决定,决定自己未来的命运和理想.这是1996年一个普通的下午,几个小时前,他刚与比尔-盖茨结束了 ...
- Azure底层架构的初步分析
之所以要写这样的一篇博文的目的是对于大多数搞IT的人来说,一般都会对这个topic很感兴趣,因为底层架构直接关乎到一个公有云平台的performance,其实最主要的原因是我们的客户对此也非常感兴趣, ...
- SQLServer内核架构剖析 (转载)
SQL Server内核架构剖析 (转载) 这篇文章在我电脑里好长时间了,今天不小心给翻出来了,觉得写得很不错,因此贴出来共享. 不得不承认的是,一个优秀的软件是一步一步脚踏实地积累起来的,众多优秀的 ...
- 《Spring Cloud与Docker微服务架构实战》配套代码
不才写了本使用Spring Cloud玩转微服务架构的书,书名是<Spring Cloud与Docker微服务架构实战> - 周立,已于2017-01-12交稿.不少朋友想先看看源码,现将 ...
- Docker技术应用场景(转载)
场景一:节省项目环境部署时间 1.单项目打包 每次部署项目到测试.生产等环境,都要部署一大堆依赖的软件.工具,而且部署期间出现问题几率很大,不经意就花费了很长时间. Docker主要理念就是环境打包部 ...
随机推荐
- 006_理解inode
inode是一个重要概念,是理解Unix/Linux文件系统和硬盘储存的基础. 我觉得,理解inode,不仅有助于提高系统操作水平,还有助于体会Unix设计哲学,即如何把底层的复杂性抽象成一个简单概念 ...
- javascript for循环 日期 select
2016年12月28日 20:01:54 星期三 html: <a href="aaaa">AAAA</a> <a href="bbbb&q ...
- Docker 导出 & 导入
Docker 容器因为它的快速部署被深受喜爱.本文记录 Docker 容器的导出与导入,分别用到 Docker 的 export 和 import 命令. 1.查看正在运行的容器: [root@loc ...
- datatables:如何禁用一列的排序
第一列是checkbox列,不需要排序,所以需要禁用掉. 代码如下: var table = $('#example1').DataTable( { 'paging' : true, 'lengthC ...
- 使用AutoFac实现依赖注入
1.基本使用 1.1新建MVC项目并安装Autofac 注意需要安装AutoFac和AutoFac.mvc5 Install-Package Autofac Install-Package Autof ...
- ubuntu安装pycharm并建立桌面快捷方式
环境:ubuntu18.04 参考文章:本地安装:https://blog.csdn.net/liuxiao214/article/details/78893457 在线安装:https://www. ...
- oracle 报表带小计合计
selectcase when (grouping(glbm)=1) then '合计' else DECODE(glbm,null,'',glbm) end glbm,case when (grou ...
- python-元类的几种单例模式
单例介绍: 单例即单个的实例,指的是同一个类实例化多次的结果都是指向同一个对象,用于节省内存空间 如果我们从配置文件中读取配置信息来进行实例化,在配置相同的情况下,就没必要重复产生对象浪费内存了. # ...
- js-DOM事件
var EventUtil = { addHandler:function(elm,type,handler){//添加事件 if(elm.addEventListener){ elm.addEven ...
- vue.js的学习
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...