传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟,因此容器要比传统虚拟机更为轻便.
简单来说:容器和虚拟机具有相似的资源隔离和分配优势,但功能有所不同,因为容器虚拟化的是操作系统,而不是硬件,因此容器更容易移植,效率也更高.

VM(VMware)在宿主机器、宿主机器操作系统的基础上创建虚拟层、虚拟化的操作系统、虚拟化的仓库,然后再安装应用;
Container(Docker容器),在宿主机器、宿主机器操作系统上创建Docker引擎,在引擎的基础上再安装应用。
容器是一个应用层抽象,用于将代码和依赖资源打包在一起.多个容器可以在同一台机器上运行,共享操作系统内核,但各自作为独立的进程在用户空间中运行.与虚拟机相比, 容器占用的空间较少(容器镜像大小通常只有几十兆),瞬间就能完成启动.
虚拟机 (VM) 是一个物理硬件层抽象,用于将一台服务器变成多台服务器.管理程序允许多个 VM 在一台机器上运行.每个VM都包含一整套操作系统、一个或多个应用、必要的二进制文件和库资源,因此 占用大量空间.而且 VM 启动也十分缓慢.
从结构来看,左图虚拟机的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也有不完美的地方,如下:
1️⃣.资源给方面不如虚拟机:docker是利用cgroup实现资源隔离的,只能限制资源消耗的最大值,而不能隔绝其他应用程序占用自己的资源;
2️⃣.安全性问题:docker目前并不能分辨出具体执行指令的用户,只要一个用户拥有执行docker的权限,那么就可以对docker的容器进行所有操作;
3️⃣.兼容性问题:docker目前还在版本快速更新中,细节功能调整较大,一些核心的模块依赖于高版本的内核,存在兼容性的问题.