今天将会介绍虚拟机和Docker容器之间的区别, 虚拟机和容器都有助于复制开发环境, 并更好地管理依赖关系和配置. 但你应该意识到某些差异, 这将有助于你根据需要选择虚拟机或Docker容器.
应用程序开发和部署的挑战
当你在一个开发团队工作时, 每个项目或者Application都需要安装多个第三方软件和软件包来构建项目环境. 为了进行协作和工作, 团队中的每个开发人员都应该配置他们的本地开发环境.
然而, 设置开发环境是一个繁琐的过程. 根据操作系统和系统配置的不同, 安装步骤有可能不同. 即使在部署期间, 你也必须在服务器上配置相同的环境.
不同的应用程序还需要一个特定软件的多个版本, 例如:PostgreSQL. 在这种情况下, 管理跨应用程序的依赖关系变得很困难.
为了应对上述挑战, 如果应用程序运行在独立的环境中, 你可以很容易地复制–独立于系统配置, 这确实有帮助.虚拟机(VM)和Docker容器都能帮助你实现这一目标.
一个Virtual Machine如何工作?
Virtual Machine或VM是对主机内的物理计算机的模拟.
运行在主机操作系统之上的是一个称为hypervisor的软件,它控制着虚拟机实例.每个虚拟机实例都有自己的Guest OS.应用程序在这个隔离的环境中运行.
你可以有多个虚拟机,每个都在不同的操作系统上运行不同的应用程序.
一个Docker 容器如何工作?
最近几年,容器技术已经彻底改变了软件开发过程以及开发和运营团队的合作方式.随着时间的推移,Docker已经成为容器化应用程序的首选.
Docker是直接运行在宿主操作系统之上的一个容器,使用沙箱机制完全虚拟出一个完整的操作,容器之间不会有任何接口,从而让容器与宿主机之间,容器与容器之间隔离的更加彻底.每个容器会有自己的权限管理,独立的网络与存储栈,及自己的资源管理能,使同一台宿主机上可以友好的共存多个容器.
Docker借助Linux的内核特性,如:控制组(Control Group),命名空间(Namespace)等,并直接调用操作系统的系统调用接口.从而降低每个容器的系统开销,并实现降低容器复杂度,启动快,资源占用小等特征.
与虚拟机不同,Docker容器不会启动自己的虚拟操作系统.相反,它们运行在主机操作系统之上.这是由容器引擎实现的.
Docker与VM的对比
虚拟机Virtual Machine与容器化技术(代表Docker)都是虚拟化技术,两者的区别在于虚拟化的程度不同.
虚拟化
根据我们到目前为止的理解,虚拟机和Docker容器都提供了运行应用程序的隔离环境.两者之间的关键区别在于它们如何促进这种隔离.
回顾一下,虚拟机启动自己的Guest OS.因此,它同时虚拟了操作系统内核和应用层.
Docker容器只虚拟化了应用层,并在主机操作系统之上运行.
兼容性
虚拟机使用自己的操作系统,与其运行的主机操作系统独立.因此,虚拟机与所有操作系统兼容.
另一方面,Docker 容器与任何 Linux 发行版兼容.您在 Windows 机器或较旧的 Mac 上运行 Docker 可能会遇到一些问题.
大小
Docker 镜像轻巧,通常在几千字节左右.
注意:Docker镜像指包含应用程序,其关联依赖项和配置的项.Docker 镜像的运行实例称为容器.
虚拟机实例可能非常大,甚至可能有几千兆.
性能
在性能方面,Docker容器提供了接近原生的性能.因为它们是轻量级的,你可以在几毫秒内启动它们.
启动一个虚拟机相当于在你的计算机内设置一个独立的机器.启动一个虚拟机实例可能需要长达几分钟的时间.
安全性
Docker 容器运行在主机操作系统之上.因此,如果主机 OS 容易受到安全漏洞的影响,那么 Docker 容器也会受到影响.
另一方面,虚拟机启动自己的操作系统,更安全.回想一下:每个虚拟机都是在另一台计算机内部运行的完整机器.如果您的敏感应用程序必须满足严格的安全约束条件,则应考虑使用虚拟机.
可复制性
下一个我们要考虑的因素是复制虚拟机和容器提供的隔离环境的容易程度.我们可以从我们早先讨论的大小和性能中推断出复制可能性.
当有多个应用程序,每个应用程序都应运行在虚拟机实例上时,使用虚拟机可能效率低下,并且会消耗大量资源.由于 Docker 容器轻巧且性能优越,因此在需要运行多个应用程序时,更喜欢使用 Docker 容器.