在对比Docker和虚拟机前,先简单了解下虚拟化,明确Docker和虚拟机分别对应的虚拟化级别,然后对Docker和虚拟机进行比较。需要注意的是,Docker和虚拟机并没有什么可比性,而是Docker使用的容器技术和虚拟机使用的虚拟化技术的比较。
虚拟化(Virtualization)简介
虚拟化是一个通用的概念,在不同的领域有不同的理解。在计算机领域,一般指的是计算虚拟化(Computer Virtualization)。维基百科上对计算机虚拟化的定义如下:
在计算机技术中,虚拟化是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,
予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以用比原来的组态更好的方式来应用这些资源。
可见,虚拟化的核心是对资源的抽象,目标往往是为了在同一个主机上同时运行多个系统或应用,从而提高系统资源的利用率,并且带来降低成本、方便管理和容错容灾等好处。
根据作用的对象,可将虚拟化分为基于硬件的虚拟化和基于软件的虚拟化。注意,真正意义上的基于硬件的虚拟化技术并不多见,少数如网卡中的单根多IO虚拟化(Single Root I/O Virtualization and Sharing Specification,SR-IOV)等技术,不在本文的讨论范围。
基于软件的虚拟化从对象所在的层次,有可以分为应用虚拟化和平台虚拟化。其中应用虚拟化一般指的是一些模拟设备,如一些模拟器软件。平台虚拟化又可细分为以下几个子类:
(1) 完全虚拟化。虚拟机模拟完整的底层硬件环境和特权指令的执行过程,客户操作系统无需进行修改。如VMware Workstation、VirtualBox等。
(2) 硬件辅助虚拟化。利用硬件辅助支持处理敏感指令来实现完全虚拟化的功能,客户操作系统无需修改,如VMware Workstation、KVM等。
(3) 部分虚拟化。只针对部分硬件资源进行虚拟化,客户操作系统修改进行修改。现在某些虚拟机技术的早期版本支持部分虚拟化。
(4) 超虚拟化。部分硬件接口以软件的形式提供给客户操作系统,客户操作系统需要进行修改,如早期的Xen。
(5) 操作系统级虚拟化。内核通过创建多个虚拟的操作系统实例(内核和库)来隔离(如容器技术)不同的进程,如Docker。
Docker与虚拟机比较
对于虚拟机来说,虚拟机通过硬件虚拟化功能模拟出运行一个操作系统所需的各种硬件,比如CPU、内存、I/O设备等。然后,它在这些虚拟的硬件上安装一个新的操作系统——客户操作系统(Guest OS)。这样,用户的应用程序就可以在这个虚拟的机器中运行。
对于Docker来说,Docker通过容器技术,在操作系统的上层提供了隔离的环境。然后用户的应用程序就可以在这个隔离的环境中运行。
虚拟机和Docker的架构差异可以用下图表示:
从上图可知,虚拟机通过虚拟的硬件,可安装一个操作提供和其他应用程序。所以,虚拟机创建的时间比较长,启动时间以分钟为单位。因为在运行应用程序前还得运行整个操作系统,所以分配所需的CPU、内存、磁盘等资源较多。同时,基于虚拟机方式运行N个不同的应用需要启用N个虚拟机(每个虚拟机需要单独分配独占的内存、磁盘等资源),运行密度较低。虚拟机因为提供了隔离操作系统的环境,所以可以实现完全隔离,从而保证安全性。
而Docker等容器引擎,可以和主机的内核直接打交道。因为容器中运行的应用程序和计算机的操作系统之间没有额外的中间层,没有资源被冗余软件的运行或虚拟硬件的模拟浪费掉。所以,容器的创建时间较短,启动时间以秒为单位。且分配所需的CPU、内存、磁盘等资源较少。同时,基于容器方式运行N个不同的应用只需要启用N个容器即可,运行密度较高。Docker等容器引擎利用namespace、cgroup、根文件系统等技术实现了容器隔离环境,支持进程级隔离,存在一定的安全风险。但是,从1.3.0版本开始,Docker重点改善了容器的安全控制和镜像的安全机制,极大地提高了使用Docker的安全性。在已知的大规模应用中,目前尚未出现值得担忧的安全隐患。
Docker等容器引擎与虚拟机的比较,可以总结为一下几个方面:
特性 | 容器 | 虚拟机 |
---|---|---|
隔离 | 提供与主机和其他容器的轻度隔离,但不提供与虚拟机一样强的安全边界 | 提供与主机和其他VM的完全隔离。 |
启动速度 | 秒级 | 分钟级 |
性能 | 接近原生 | 较弱 |
资源占用 | 运行操作系统的用户模式部分,可以对其进行定制,使之只包含应用所需的服务,减少所使用的系统资源。 | 运行包含内核的完整操作系统,需要更多的系统资源,如CPU、内存、存储等。 |
运行密度 | 单机支持上千个容器 | 单机一般十几个 |
安全性 | 轻度隔离,存在不安全隐患 | 完全隔离,安全性更高 |
参考
《Docker实战》 Jeff Nickoloff 著, 胡震,杨润青 黄帅 译
《Docker技术入门与实战》 杨保华 戴王剑 曹亚仑 著
https://blog.daocloud.io/4001.html 容器与虚拟机
https://zhuanlan.zhihu.com/p/81525291 虚拟机与容器的区别
https://zhuanlan.zhihu.com/p/271846374 容器、Docker、虚拟机
https://learn.microsoft.com/zh-cn/virtualization/windowscontainers/about/containers-vs-vm 容器与虚拟机
https://aijishu.com/a/1060000000206531 Docker容器、虚拟机和裸机运行的性能比较