微服务重要的容器技术Docker的核心实现技术
Posted LuckQI
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微服务重要的容器技术Docker的核心实现技术相关的知识,希望对你有一定的参考价值。
Docker 作为一种容器虚拟化技术,应用了操作系统的多项底层支持技术。其中的技术层包含Linux操作系统的命名空间Namespace,控制组,联合文件系统,Linux网络虚拟化。
命名空间
命名空间在Linux中是一个强大的特性,并且容器Docker也利用该特性,在容器上建立属于自己的命名空间不与其他容器进行互相影响。
进程命名空间
在Docker中利用了Linux内核中的PID空间技术,并且在不同的PID命名空间上,进程都是独立的。不同的空间下可以有相同的PID。该层级是一个树状结构,在创建新的PID会跟原先形成一个层级父子关系。
网络命名空间
进程命名空间让各个进程之间进行相互隔离,但是网络端口还是共享的本地的。
然后通过网络命名空间我们可以实现网络之间的隔离,就跟进程之间形成隔离一样。
在这个空间里面有完全独立的网络协议栈。包含了各个设备接口,IPV4和IPV6协议,IP路由表,防火墙规则,sockets等。
Docker采用的是虚拟网络设备方式,将不同的网络设备连接到一起。默认是与本地主机上的docker0网卡连接到一起。
IPC命名空间
进程之间怎么交互,在Linux里面采用的是IPC的方式 包含信号量,消息队列,共享内存。
PID 命名空间可以与IPC 命名空间组合使用,允许进程间的交互。不同空间内的进程无法交互
挂载命名空间
将一个进程放入到特定的目录执行,每个命名空间内的进程看到的文件目录彼此隔离。
UTS命名空间
该空间允许每个容器拥有独立的主机名和域名,从而虚拟出一个独立的主机名和网络空间。
用户命名空间
每个容器都拥有不同的用户和用户组,可以在容器内使用特定的内部用户参与执行程序,而非本地系统存在的用户。可以使用隔离的用户名空间,提高安全性,避免容器内进程获取到额外的权限。
控制组
控制组是Linux 内核的一个特性。主要是用来控制分配到容器的资源,才能避免多个容器同事运行时对宿主机系统的资源竞争。
控制组提供对容器的内存,CPU,磁盘IO等资源进行管理,并且针对不同的设计情况,提供了统一的接口,从而控制单一进程。
资源限制
首先我们对于每个容器需要使用的内存大小有限制,如果超过固定的大小或者超过使用限制的大小,就出现异常情况。
优先级
通过控制优先级来让一些组内得到更多的CPU ,内存,磁盘IO资源等等。
资源审计
用来统计系统把多少资源用到适合的目的上。
隔离
隔离命令空间,这样一个组不会看到另外一个组内的进程,网络连接和文件系统。
控制
挂起、回复和重启等操作。
当然我们在使用容器的时候也可以在启动的时候指定资源的大小,包含容器的cpu,内存等等信息。
联合文件系统
联合文件系统是一个轻量级的高性能分层文件系统,支持将文件系统中的修改信息作为一次提交,并层层叠加,同事将不同的目录挂载在同一个虚拟文件系统下,应用看到的是挂载的最终结果。
并且当Docker文件系统进行修改后,才去的是增量更新的方式,采用更新也是一种轻量级的操作。
我们在一个镜像上进行修改,则是创建的一个新的层级,不需要更换原先的内容只需要做到新增即可
Docker存储
通过插件的方式来支持多种文件系统后端。AUFS 文件为每一个目录设置只读,读写,写出权限。也有分层的概念,进行增量更新。
Docker镜像就是由多个文件层级构成,我们下载的时候不同的id就代表一个层级。
对于Docker景象来说内容是不可修改的,只能读取。内容更新操作会发生在可读写层。我们一般建议容器修改的数据通过 volume方式进行挂载。不修改镜像内的数据。
多种文件系统
AUFS ,OverlayFS,Device Mapper,btrfs,vfs,zfs,等文件系统,但是现在使用最广泛的是AUFS 和Device Mapper的应用最为广泛,也想多成熟,但是长期来看OverlayFS性能更好些。
Linux 网络虚拟化
Docker中采取的是虚拟的网络接口,虚拟的网络接口特点是转发效率高。这是因为直接通过内核进行数据复制达到数据转发的。无需通过外部的网络设备进行交换。
网络创建过程
创建一对虚拟接口,分别放到本地主机和新容器的命名空间里面。
本地接口连接到docker0网桥上,当然这里可以更改。并且赋给一个veth开头的名字。
容器端的虚拟接口命名为veth0 ,只在容器中可见。
上面这些就是简单的概念性知识介绍,了解这些内容,能帮助我们在以后工作的时候进行docker容器的调整。
●
●
●
●
●
以上是关于微服务重要的容器技术Docker的核心实现技术的主要内容,如果未能解决你的问题,请参考以下文章