参照以下两张图来对比说明:

从硬件资源利用情况看

虚拟机(VM)实际上利用了虚拟化的技术,获取了主机上实际的硬件资源(内存、CPU),通过获取到的硬件资源重新构建一个接近于真实的机器,而这部分被分配过的硬件资源(比如 512MB 内存)在虚拟机启动了以后,不管是否真的有使用到了,对于主机来说就真的少了这部分的资源了( 可用内存 = 物理内存 - 512MB);

而 Docker 利用的是 Linux 主机上的内核技术,当一个容器在运行的时候,实际上是“映射”成主机上的一批进程,这些进程相互独立,共享主机的硬件资源,假设容器1运行 MySQL 占用了 100MB 内存,容器2运行 nginx 占用 50MB 内存,在理论上(不计算容器本身的损耗的话)主机当前剩余可用内存 = 物理内存 - 100MB - 50MB;

从程序运行归属情况看

VM中的程序,是在隔离于主机的一个独立的操作系统(GuestOS)中运行的,程序运行的前提是 GuestOS 处于启动的状态,而程序运行后对于主机来说是完全透明的,主机无法看到VM中运行了什么进程;

而在 Docker 容器中运行的程序,只是隔离了程序的依赖关系(Bins/Libs),程序的执行者还是属于主机的,对主机来说所有容器在执行的程序都是主机的进程,不存在 GuestOS 所以也不存在需要启动 GuestOS;

从对主机操作系统的依赖看

VM依赖的是虚拟化技术(Hypervisor),当具体使用的技术是在对应的平台下能运行的话,该操作系统平台就可以创建VM并运行;

而 Docker 的运行原理是基于 LXC,这是基于 Linux 内核版本 2.6.24+ 以上才有的技术,所以依赖于 Linux,在其它平台上(Windows、OSX)无法直接使用(但可通过VM创建一个Linux系统来使用);

Docker技术问答:http://linux.xyz/topic/Docker