docker和虚拟机的区别

本文参考自:
https://clsn.io/clsn/lx1473.html
「Docker进阶与实战」– 华为Docker实践小组 著

docker实际上是对cgroup,namespace,lxc的封装。仅仅是进程本身跟其他进程的隔离,完全是通过软件层面来实现的。

因为仅仅是多开个进程,因此一个服务器就可以开几十个上百个docker容器都没有问题,无非就是多点进程,如果都不是费IO的,那应该都可以。

而且docker可以做到秒级的启动。毕竟就跟平时启动进程没多大区别。

那这里好像都是docker的优势,那缺点必然伴随而来。那就是docker并不是完整的操作系统,不能像虚拟机那样做到对资源的彻底隔离。

那再说下虚拟化,老人肯定知道以前要安装虚拟机是不是还要查下自己CPU的指令集是否支持,特别是2005年前后的时候。 Intel CPU 的 vmx 或者 AMD CPU 的 svm

1
egrep "(vmx|svm)" /proc/cpuinfo

但是我们知道虚拟化在更早的时候其实就已经出现了,可为什么到了2005年前后才会在cpu上有这些指令集扩展呢?

看看xen是从2003年开始发展起来的,而vmware更是1999年就开始了。

那之前是这些虚拟软件是如何工作的呢?

要搞清楚这个就需要先弄明白计算机是如何工作的。

就跟图里看到这里分了ring0,ring1,ring2,ring3,
其中ring0就是内核了,ring1,ring2就是驱动。ring3就是外部应用程序了。

ring0是指CPU的运行级别,ring0是最高级别,ring1次之,ring2更次之…… 拿Linux+x86来说, 操作系统(内核)的代码运行在最高运行级别ring0上,
可以使用特权指令,控制中断、修改页表、访问设备等等。 应用程序的代码运行在最低运行级别上ring3上,不能做受控操作。
如果要做,比如要访问磁盘,写文件,那就要通过执行系统调用(函数),执行系统调用的时候,CPU的运行级别会发生从ring3到ring0的切换,
并跳转到系统调用对应的内核代码位置执行,这样内核就为你完成了设备访问,完成之后再从ring0返回ring3。这个过程也称作用户态和内核态的切换。
那么,虚拟化在这里就遇到了一个难题,因为宿主操作系统是工作在ring0的,客户操作系统就不能也在ring0了,但是它不知道这一点,
以前执行什么指令,现在还是执行什么指令,那肯定不行啊,没权限啊,玩不转啊。

因此全虚拟化就是:

VMM在ring0上,一般以驱动程序的形式体现,驱动程序都是工作在ring0上,否则驱动不了设备。 一般是这样做,客户操作系统执行特权指令时,
会触发异常(CPU机制,没权限的指令,触发异常),然后VMM捕获这个异常,在异常里面做翻译,模拟,最后返回到客户操作系统内,
客户操作系统认为自己的特权指令工作正常,继续运行。但是这个性能损耗,就非常的大,你想想原来,简单的一条指令,执行完,了事,现在却要通过复杂的异常处理过程。

而半虚拟化就是:

半虚拟化的思想就是,让客户操作系统知道自己是在虚拟机上跑的,工作在非ring0状态,那么它原先在物理机上执行的一些特权指令,就会修改成其他方式,
这种方式是可以和VMM约定好的,这就相当于,我通过修改代码把操作系统移植到一种新的架构上来,就是定制化。
所以像XEN这种半虚拟化技术,客户机操作系统都是有一个专门的定制内核版本,和x86、mips、arm这些内核版本等价。
这样以来,就不会有捕获异常、翻译、模拟的过程了,性能损耗非常低。这就是XEN这种半虚拟化架构的优势。这也是为什么XEN只支持虚拟化Linux,无法虚拟化windows原因,微软不改代码啊。

而后面硬件也支持虚拟化后就带来了新的变化

CPU厂商,开始支持虚拟化了,情况有发生变化,拿X86 CPU来说,引入了Intel-VT 技术,支持Intel-VT 的CPU,有VMX root operation 和 VMX non-root operation两种模式,
两种模式都支持Ring 0 ~ Ring 3 这 4 个运行级别。这下好了,VMM可以运行在VMX root operation模式下,客户OS运行在VMX non-root operation模式下。
也就说,硬件这层做了些区分,这样全虚拟化下,有些靠“捕获异常-翻译-模拟”的实现就不需要了。
而且CPU厂商,支持虚拟化的力度越来越大,靠硬件辅助的全虚拟化技术的性能逐渐逼近半虚拟化,再加上全虚拟化不需要修改客户操作系统这一优势,全虚拟化技术应该是未来的发展趋势。

想起2011年跟TJ同学两个人搞xen半虚拟化搞了很久,从编译内核都一点点来。对于性能有所下降也认了,然后当时问题是在磁盘格式上raw和qcow2纠结了很多。

而从现在看来xen基本上是被淘汰了,各家云厂商基本上都转到了kvm上了,xenapp这种只能自己内部玩玩。而其原因我们就后面再讨论下。