浅谈Docker与VM虚拟机的差异
汪汪 2018.09.19

所有的应用程序都有自己的依赖关系,其中包括软件和硬件资源。Docker是开发者的开放平台,通过将每个应用程序打包到容器中来隔离依赖关系。容器就像是轻量级的虚拟机,可以扩展到成千上万的节点,通过在不同虚拟环境中运行相同应用程序来帮助提升云的可移植性。虚拟机广泛用于云计算,通过使用虚拟机来实现隔离和资源控制。 虚拟机使用自己的内存管理加载完整的操作系统,使应用程序更加高效和安全,同时确保其高可用性。


Docker容器与虚拟机有什么不同? 
虚拟机具有完整的操作系统,其自身的内存管理通过相关的虚拟设备进行支持。在虚拟机中,为用户操作系统和虚拟机管理程序分配有效的资源,从而可以在单台计算机(或主机)上并行运行一个或多个操作系统的多个实例。每个客户操作系统都作为主机系统中的单个实体运行。 
另一方面,Docker容器是使用Docker引擎而不是管理程序来执行的。 因此容器比虚拟机小,并且由于主机内核的共享,可以更快地启动,具有更好的性能,更少的隔离和更好的兼容性。 Docker容器能够共享一个内核并共享应用程序库,因此容器比虚拟机具有更低的系统开销,只要用户愿意使用单一平台来提供共享的操作系统,容器可以更快,更少资源。虚拟机可能需要几分钟才能创建并启动,而只需几秒钟即可创建并启动一个容器。与在虚拟机中运行应用程序相比,容器中包含的应用程序提供了卓越的性能。 
Docker容器比虚拟机弱的一个关键指标就是“隔离”。英特尔的VT-d和VT-x技术为虚拟机提供了ring-1硬件隔离技术,因此虚拟机可以充分利用它的优势。它可以帮助虚拟机器高效使用资源和防止相互干扰。 Docker容器还没有任何形式的硬件隔离,因此它们容易受到攻击。


如何进行进行选择? 
选择容器还是虚拟机依赖于应用程序如何设计。如果应用程序旨在提供可伸缩性和高可用性,那么容器是最好的选择,否则应用程序可以放置在虚拟机中。对于高I/O要求的业务,例如数据库服务,建议部署Docker+物理机,因为在虚拟机中部署Docker,I/O性能将受到虚拟机的限制。对于虚拟桌面服务等强调租户权限和安全的业务,建议采用虚拟机方式,虚拟机的多租户强隔离特性,保证租户在拥有虚机root权限的同时,其他租户和主机的安全。 
或者更好的选择是混合方案,运行在虚拟机中的容器。 Docker容器可以在虚拟机内部运行,虚拟机并为它们提供经过验证的隔离,安全属性,移动性,动态虚拟网络等。为实现安全隔离和资源的高利用率,基本应该遵循:不同租户的业务运行采用虚拟机隔离,相似类型的业务部署在同一组容器上的思路。


结论
Docker容器正在成为DevOps环境中的一个重要工具。 DevOps领域内的Docker Containers的用例非常多。在Docker容器上运行应用程序,然后在任何地方部署(Cloud或内部部署或任何Linux的风格)现在都已成为现实。 
在异构环境中工作,虚拟机提供了高度的灵活性,而Docker容器主要关注应用程序及其依赖关系。Docker Containers允许通过使用每个云的虚拟机环境来处理云,从而轻松移植跨云的应用程序堆栈。这代表了一个有用的功能,在没有Docker Containers的情况下,必须以更加复杂和乏味的方式来实现。这里阐述的并不是关于放弃虚拟机,而是在必要时除了虚拟机之外,根据实际情况使用Docker容器,不认为Docker容器可以完全清除虚拟机。