传统虚拟化技术与容器技术对比
1、传统的虚拟化技术
传统的虚拟化技术会在已有主机的基础上创建多个虚拟主机,然后在每个虚拟主机上安装独立的操作系统,并由虚拟主机的内核空间和用户空间来运行应用程序
2、docker容器技术
使用主机的硬件,在硬件之上安装一个操作系统,使用相同的内核。然后将用户空间进行隔离,从而分成多个用户空间,基于一个内核来运行。因为容器使用这种隔离用户空间的方式,使得一样可以提供多个应用程序的环境(而应用程序的环境我们称之为容器),所以可以理解为是用户空间的虚拟化技术
容器拥有更高的资源使用效率,因为其无需为每个应用分配一个独立的操作系统,可以使得应用,资源消耗较小,迁移与创建的速度更小。
区别:kvm,xen隔离的非常好,因为他们有自己的内核空间和用户空间,但是容器技术的话,整个容器只有一个内核,不同的是,各虚拟机之间隔离开的仅仅是用户空间。
容器所用到的核心技术
NameSpace:名称空间(资源隔离机制)
在内核级别:完成环境隔离的方法(类似于chroot机制)
PID NameSapce Linux 2.6.24
PID隔离,隔离PID号,能够在每一个隔离出来的容器当中来实现虚拟出各种你所需要的PID,使得每一个用户看到的PID号都是独立的,互不干扰Network NameSpace: Linux 2.6.29
网络设备、网络栈、端口等网络资源隔离,用于网络虚拟容器隔离User NameSpace Linux 3.8
用户和用户组资源隔离,完成用户隔离,每一个用户的名称空间当中都有可能可以存在所谓同样用户名的用户 linux 3.8(所以docker是依赖于linux 3.8以后的版本,或者要求更高,是3.10以后的版本)IPC NameSpace Linux 2.6.19
进程间通信资源隔离(信号量、消息队列和共享内存的隔离)UTS NameSpace Linux 2.6.1
主机名和域名隔离Mount NameSpace linux 2.4.19
挂载点隔离(真正是实现文件系统给的隔离) 实现已挂载文件系统隔离的,期望在不同的用户空间当中所通过内核看到的挂载的文件系统应该是不一样的。
向NameSpace发起调用所使用的API
我们为了向namespace发起调用,让namespace完成某些操作
clone() 克隆 ,实现线程的系统调用,用来创建新线程
setns() 设定名称空间属性,将某进程加载到某个NameSpace去
unshare() 做成非共享机制,使进程脱离某个NameSpace的关联到你的新NameSpace当中的
CGroup (Linux Control Group) 控制组
一个用户空间可以将整个服务器的CPU耗尽,那么其他用户空间将无法运行,所以仅有名称空间是无法满足,所以有另一个技术,叫CGroup(linux 2.6.24)
CGroup 内核级别的技术,用于限制、控制与分离一个进程组群的资源(用户自己隔离和建立的),用于实现将进程分完组以后,组内的进程能使用多少的系统级的资源,可以在内核级上加以限制
一般用于隔离一个进程集合,为进程分配足够内存带宽然后限制其访问那些设备,从而完成限制机制
CGroup + NameSpace 结合起来就能实现容器功能
CGroup实现的功能
Resource limitation:资源限制
Prioritization:优先级控制
Accounting:审计和统计功能,主要是为了计费(VPS计费)
Control:挂起进程,恢复进程
CGroup的子系统(subsystem)
可使用 lssbusys - m 查看资源组当中的子系统
cgroup 是基于单根树状结果进行组织的 ,在 /sys/fs/cgroup
blkio:设定块设备的IO限制
cpu:使用调度程序对cpu的CGroup的任务访问,设定CPU的限制(限制CPU使用的空间)
cpuacct:报告cgroup当中所使用的CPU资源
cpuset:为cgroup中的任务制定可用的cpu和内存资源(分配内存和CPU)
memory:设定内存的使用限制(限制内存使用的空间),分配是按段来分配,而不是按空间分配
device:控制cgroup中的任务对设备的访问能力
freezer:实现挂起进程或恢复cgroup中的任务
net_cls:(classid),使用等级级别标识符来标记网络数据包,以实现基于TC完成对不同的cgroup中产生的流量控制
perf_event:对每一个用户空间当中的任务的运行时的性能本身分别所产生的事件进行归类统计(使用后使cgroup中的任务可以进行统一的性能测试)
hugetlb:对HugeTLB系统进行限制,能够实现在内存分配时的减少内存分配的次数。
CGroup中的术语
task(任务):指的是进程或线程
cgroup:一个独立的资源控制单位,可以包含一个或多个子系统。每个控制组上可以关联一个或多个子系统,一个任务只能属于一个cgroup
subsystem:子系统,需要关联到cgroup
hierarchy:资源组的层级结构,层级是有一系列cgroup以一个树状结构排列而成,每一个层级通过绑定对应的子系统进行资源控制,层级中的cgroup节点可以包含零个或多个节点,业也就是你地下还可以继续分层,而子集可以继承父级的某些资源。
AUFS: UnionFS 联合文件系统
UnionFS:能够实现把不同的物理位置的目录能够合并到同一目录中
虽然是合并,但是事实上他是一种叠加。可以合并多个,只有最上层的那个才是可写的。
对于读
如果合并的文件存在重复,只有最后一个合并的可被看到
如果文件不重复,可以看到其他层里不重复的文件
对于写
合并多个目录时,只有最后一个合并的可被写
在其他层看到的文件想去修改,实际上是在最上层创建一个文件进行写的操作。(他的原理有点类似PE的工作方式,比如你在PE上写,其实写的是在本地磁盘上)
docker很依赖AUFS,所以如果没有AUFS的话,不建议docker在生产环境上使用
遗憾的是centos并不支持AUFS,在ubuntu上已经支持AUFS
Device mapper:功能类似AUTFS,LVM用的就是这个技术
Linux 2.6内核引入的最重要技术之一,用于在内核中支持逻辑卷的通用设备映射技术。
Mappend Device:被映射出来的设备
Mapping Table 映射表,指明了被虚拟出来的设备和真正底层设备有哪些。(相当于从虚拟设备到真正物理设备之间的映射路径)
Target Device:源设备