目录linux
虚拟化按目前使用的类别分类,可分为两种,主机级别虚拟化
和容器级别虚拟化
docker
这种虚拟化,hypervisor绕过咱们熟知的os内核,直接接管硬件,而后本身再虚拟出对应所须要的os内核。主要产品有VMware ESXI,以下图左侧ubuntu
宿主机虚拟化,hypervisor层运行于宿主机os之上,经过主机os内核来进行硬件的内核调试,主要产品有VMware workstation,如上图右侧centos
容器虚拟化,有别于主机虚拟化,其存在宿主机os,但其与主机级别虚拟化的type-II不同,并不是进行内核的虚拟化,而是经过namespace进行虚拟化,经过namespace的隔离,进行各程序的隔离,经过cgroups,进行资源的控制,以此来进行虚拟化。以下图网络
linux 内核从版本 2.4.19 开始陆续引入了 namespace 的概念。当一个程序运行于主机之中时,其基本要求有,系统根文件目录、运行pid进程号、主机名、网卡、ipc通讯、程序运行用户这六大类。app
linux将以上六类进行了内核级别的虚拟化,这六大类统称为namespace分布式
namespace | 引入的相关内核版本 | 被隔离的全局系统资源 | 在容器环境下的隔离效果 |
---|---|---|---|
Mount | 2.4.19 | 文件系统挂接点 | 每一个容器能看到不一样的文件系统层次结构 |
UTS | 2.6.19 | hostname | 每一个容器能看到本身的hostname |
IPC | 2.6.19 | 进程间通讯 | 同一个IPC namespace的进程之间能互相通信 |
PID | 2.6.24 | 进程PID | 每一个PID namespace中的进程能够有其独立的PID,每一个容器能够有其PID为1的root进程 |
Network | 始于2.6.24完成于2.6.29 | 网络相关的系统资源 | 每一个容器用有其独立的网络设备,IP地址,IP路由表,/proc/net目录,端口号 |
User name | 始于2.6.23完成于3.8 | 用户和组ID空间 | 每一个container能够有不一样的user和group id |
由于centos6的内核为2.6,因此user name不支持,因此centos6自然不太支持容器,虽然能够经过升级内核来进行支持,不过建议直接使用centos7以上的系统oop
cgroups: Linux control groups,linux为运行的任务分配cpu、ram等,当namespace为容器进行隔离以后,还须要对每一个容器进行资源的使用进行控制,不能让其抢占其它容器的资源。性能
cgroups主要对如下内容进行资源控制测试
AUFS:Union File System,联合文件系统,主要功能是将位于不一样物理位置的目录合并成同一个目录,有点相似于hadoop中hdfs的分布式存储。
linux系统启动,至少须要有两种文件系统,一种是bootfs
,一种是rootfs
,
bootfs:包含 boot loader 和 kernel。用户不会修改这个文件系统。实际上,在启动(boot)过程完成后,整个内核都会被加载进内存,此时 bootfs 会被卸载掉从而释放出所占用的内存。同时也能够看出,对于一样内核版本的不一样的 Linux 发行版的 bootfs 都是一致的。
rootfs:包含典型的目录结构,包括 /dev, /proc, /bin, /etc, /lib, /usr, and /tmp 等再加上要运行用户应用所须要的全部配置文件,二进制文件和库文件。这个文件系统在不一样的Linux 发行版中是不一样的。并且用户能够对这个文件进行修改。
同一个内核版本的全部linux系统的bootfs是相同的,rootfs不一样
在docker images中,其采用的是分层技术,基础镜像中的roofs会一直保持只读模式,docker利用union mount来在这个rootfs上增长更多的只读文件系统,最后它们看起来就像一个文件系统即容器的rootfs。
在docker的分层镜像中,除了支持aufs以外,还支持devicemapper,由于在aufs暂时还未被收归入linux内核主干,ubuntu14支持aufs,因此docker在ubuntu上面使用aufs,而做为比较保留的redhat系列上,docker使用的devicemapper