1)docker与虚拟机实现的原理是怎样的呢?
从结构 来看,左图虚拟机的Guest OS层和Hypervisor层在docker中已经被Docker Engine层所取代,在这里我们 需要知道的是Guest OS是虚拟机安装的操作系统,是一个完整的系统内核,另外,Hypervisor可以理解为一个硬件 虚拟化平台,它在Host OS层是以内核驱动状态存在的;虚拟机实现资源隔离的方式就是利用独立的Guest OS,并Hypervisor虚拟化CPU,内存,IO等设备实现;
对比虚拟机实现资源和环境隔离的方案,docker显然就是简练的很多,Docker Engine可以看成linux的namespace,cgroup,镜像管理文件系统操作的封装,docker并没有和虚拟机一样利用一个完全独立的Guest OS实现环境隔离,利用的是目前linux内核本身支持的容器方式实现的资源和环境隔离,简单的来说,docker就是利用namespace实现的系统环境的隔离,利用cgroup实现资源限制;利用镜像实现根环境的的隔离
上述 简单的总结一下:
#docker有着比虚拟机更少的抽象层,由于docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源,因此,在CPU,内存利用率上,docker将会在效率上更有优势;
#docker利用宿主机的内核,不需要Guest OS,从而减少了加载操作系统内核的时间和资源的消耗;
2)docker与虚拟机启动的时间及资源消耗的比较
docker之所有如此受到关注,另外一个重要原因是启动docker的系统代价比启动一台虚拟机的代价要低得多;无论是从启动时间还是从启动资源消耗的角度来说,docker直接利用宿主机的系统内核,避免了虚拟机启动时所需要的系统引导时间和操作系统运行的资源消耗,利用docker能在几秒钟之内启动大量的容器,这是虚拟机无法办到的,快速启动,低资源消耗的优点使得docker在弹性云平台和自动运维系统方面有着很好的应用前景
3)docker的劣势
上述论述了docker相对于虚拟机的优势,但是docker也有不完美的地方,如下:
#资源给方面不如虚拟机,docker是利用cgroup实现资源隔离的,只能限制资源消耗的最大值,而不能隔绝其他应用程序占用自己的资源;
#安全性问题,docker目前并不能分辨出具体执行指令的用户 ,只要一个用户拥有执行docker的权限,那么就可以对docker的容器进行所有操作;
#兼容性问题,docker目前还在版本快速更新中,细节功能调整较大,一些核心的模块依赖于高版本的内核,存在兼容性的问题