Docker 与虚拟机之间有什么区别?
Docker 和虚拟机是应用程序部署中使用的两种技术。在软件开发生命周期中,通过部署准备好应用程序代码以供最终用户运行。Docker 是一个开源平台,开发人员使用该平台将软件打包到称为容器的标准化单元中。容器既有应用程序代码,也有其环境,包括库、系统工具和运行时系统。使用 Docker,您可以在任何计算机上部署和扩展应用程序,并确保代码持续运行。相比之下,虚拟机是实体计算机的数字副本。您可以在同一主机操作系统上运行具有各自独立操作系统的多个虚拟机。开发人员对虚拟机进行配置,创建应用程序运行环境。虚拟机上也可运行 Docker 容器。
虚拟化:Docker vs. 虚拟机
通过虚拟化可以创建真实资源的虚拟实例,例如服务器和网络。在计算中,虚拟化允许虚拟化组件的多个隔离实例在实体组件上运行。
例如,一台物理服务器上可运行多个虚拟服务器。通过在多个虚拟实例之间共享现实生活中的资源,它们可以得到更好的利用,运行起来也更具成本效益。虚拟化是大量应用程序开发和部署的基础。
虚拟机
顾名思义,虚拟机提供整台机器(服务器)的虚拟化。虚拟机模拟物理机的硬件组件,例如 CPU、内存、网络接口卡、USB 控制器和声卡。您可以在虚拟环境中运行客户机操作系统和多个应用程序。
虚拟机使云技术成为可能,在 Amazon Web Services(AWS)中,虚拟机称为实例。这些云实例由 AWS 拥有和维护,可通过 API 使用。
Docker
虚拟机可在任何硬件上运行。Docker 允许您在任何操作系统上运行应用程序。它采用隔离的用户空间实例,称为容器。
Docker 容器有自己的文件系统、依赖结构、进程和网络功能。该应用程序在容器内拥有所需的一切,并且可以在任何地方运行。Docker 容器技术直接使用底层的主机操作系统内核资源。
Docker 和虚拟机之间还有哪些其他相似之处?
作为虚拟化技术,Docker 和虚拟机有某些相似之处。
映像
Docker 容器和虚拟机都是根据映像创建的。每个映像都是虚拟化环境的蓝图。映像允许用户创建和共享一致的环境,而不必每次都对其进行配置。
映像会指定运行应用程序所需的所有系统资源。例如,虚拟机映像创建的是操作系统备份,而 Docker 容器映像创建的是应用程序环境备份。
版本控制
可以对 Docker 容器映像和虚拟机映像进行版本控制,以跟踪环境配置随时间推移而发生的变化。
Docker 的版本控制是指能够跟踪和管理 Docker 映像随时间推移而发生的变更。通过版本控制,开发人员可以跟踪其应用程序的不同版本,必要时回滚到以前的版本,并同时部署应用程序的不同版本。
同样,虚拟机中的版本控制是指跟踪和管理虚拟机映像随时间推移而发生的变更。虚拟机版本控制可跟踪虚拟硬件或操作系统配置的变更(例如更新和补丁)。
便携性
虚拟机和 Docker 都可以解决必须为不同类型的底层架构开发不同应用程序配置的难题。尽管 Docker 和虚拟机映像采用不同的方法来应对挑战,但无论是在本地还是在云端,都具有高度的跨架构便携性。
主要区别:Docker vs. 虚拟机
虚拟机和 Docker 都解决了在不同环境中运行应用程序这一难题。但两者的原因和方法略有不同。
目标
虚拟机最初的设计目的是允许多个操作系统在一台物理机上运行。目标是允许用户创建与底层硬件相隔离的虚拟环境。虚拟机提取出硬件详细信息,以便更轻松地在不同的硬件架构上运行应用程序,并更有效地使用硬件资源。
而 Docker 旨在提供一种轻量级便携方式,以便在隔离且可重现的环境中打包和运行应用程序。Docker 提取出操作系统的详细信息,解决在不同环境(例如开发、测试和生产)中部署应用程序的挑战。在任何地方都能管理软件环境更新和保持环境一致性是非常具有挑战性的。对于运行数百个应用程序或将应用程序分解为数百个微服务的组织而言,尤其如此。Docker 通过容器化解决了这个问题。
最终产品
Docker 是 Docker 公司拥有和运营的开源容器平台。也有像 Podman 这样的替代平台,尽管它们的使用率远没有这么高;Docker 是容器化的代名词。容器是构件,是最终用户可使用的部分。
而虚拟机本身对最终用户来说就是可用部分。该技术与特定品牌无关。您可以在本地数据中心部署虚拟机,也可以通过 API 将其作为托管云服务进行访问。
架构
虚拟机运行自己的内核和主机操作系统,以及应用程序及其依赖关系,例如库和其他二进制文件。虚拟机监控器在硬件(主机或服务器)和虚拟机之间进行协调。它将实例化过程中概述的物理硬件资源分配给虚拟机供其专用。一台功能强大的服务器上可以运行多个虚拟机,由单个虚拟机监控器管理,每个虚拟机上运行数百个应用程序。
而 Docker 容器中只包含该容器的依赖关系。Docker Engine 软件为 Docker 中的虚拟化提供支持。它提供运行中的容器和底层操作系统(无论是物理机还是虚拟机)之间的协调。
要利用 Docker 进行更高级的虚拟化管理,请使用 Kubernetes。欲了解更多信息,请阅读 Kubernetes 和 Docker 之间的区别?
资源共享
虚拟机和 Docker 容器都使用资源多路复用或在虚拟化实例之间的共享资源。
虚拟机预先向硬件请求特定数量的资源,并且只要虚拟机处于运行状态,就会继续稳步占用该资源。
而 Docker 容器则根据需要来使用资源。它们不像虚拟机那样要求特定数量的物理硬件资源,而只是从单一操作系统内核请求所需的资源。多个容器共享同一个操作系统。Docker 容器直接与内核共享资源,与虚拟机相比,消耗的系统资源更少。
安全性
为了实现较少的资源消耗,Docker 容器与主机操作系统共享内核,因此如果内核中存在漏洞,它们就会面临风险。不过,Docker 也提供了许多高级安全控制。
相反,由于虚拟机运行整个操作系统,因此在运行应用程序时会提高隔离级别。只要操作系统采取了严格的安全措施,虚拟机就能提供更高的安全性。
何时使用:Docker vs 虚拟机
Docker 容器在 Linux 架构上运行,需要特定于 Linux 内核的功能,例如命名空间和控制组(cgroup)。开发人员经常在基于 Linux 的虚拟机上运行 Docker 平台。Docker 将应用程序代码打包到可在任何地方运行的容器中。环境更新仅在容器中完成一次。您不必更新应用程序环境。
例如,您可以在 AWS 中启动某个实例,然后立即使用预先配置了 Docker 的亚马逊云机器镜像(AMI)加载该实例。
但是,如果您要具体决定是使用虚拟机(VM)还是 Docker 来部署应用程序,则取决于应用程序的运行要求。
何时使用虚拟机
如果您运行的应用程序符合以下条件,则适合使用虚拟机:
- 与操作系统有特定的依赖关系
- 对硬件资源有大量需求
- 需要在操作系统中设置各种控件
- 传统应用程序不再在现代操作系统上运行
- 需要使用不同的操作系统,但提供了单一的底层物理基础架构
应在何时使用 Docker
如果您运行的应用程序符合以下条件,则适合使用 Docker:
- 对资源需求较小或属于微服务架构
- 需要分布式物理基础设施环境,包括基于云的服务器
- 部署周期短(因为 Dockerfiles 比虚拟机配置更易于管理)
- 要求快速可扩展性
区别总结:Docker vs.虚拟机
Docker 容器 |
虚拟机 |
|
它是什么? |
Docker 是一个用于创建和运行 Docker 容器的软件平台。Docker 容器是对用户空间实例的模拟,用户空间实例则是运行用户进程的操作系统的一部分。 |
对运行操作系统的物理机(包括虚拟化硬件)的模拟。 |
虚拟化 |
容器从应用程序代码中提取操作系统详细信息。 |
虚拟机从应用程序代码中提取硬件详细信息。 |
目标 |
提取硬件详细信息并提高硬件利用率。 |
改善应用程序环境管理,实现多环境之间的一致性。 |
托管主体 |
Docker Engine 在操作系统和 Docker 容器之间进行协调。 |
虚拟机监控器在计算机的物理硬件和虚拟机之间进行协调。 |
架构 |
与底层主机内核共享资源。 |
运行自有内核和操作系统。 |
资源共享 |
按需共享。 |
按固定数量共享,在虚拟机映像的配置要求中设置。 |
AWS 如何支持您的应用程序部署需求?
Amazon Web Services(AWS)提供一系列虚拟机(VM)和 Docker 管理专用服务:
- Amazon Elastic Cloud Compute(Amazon EC2) 提供 600 多种不同类型的实例,这些实例安全、可靠、可扩展。通过加载亚马逊云机器镜像(AMI)模板,您可以在几分钟内准备好完全指定的开发、测试或生产环境服务器。
- Amazon Elastic Container Service(Amazon ECS) 是一项完全托管的容器编排服务,可以让您轻松部署和扩展容器化应用程序。客户可以对其容器实例进行配置,以便访问虚拟私有云(VPC)内的专有 Docker 映像注册表或者可从 VPC 外部访问的注册表。
- 借助 Amazon Elastic Container Registry (Amazon ECR),您可以轻松地在任何地方存储、共享和部署容器。Amazon ECR 与 Docker 命令行界面(CLI)集成,可简化您的开发和生产工作流程。例如,您可以使用开发计算机上的 Docker CLI 将容器映像推送到 Amazon ECR。而且 Amazon 容器编排工具可以直接将它们提取出来进行生产部署。
- AWS Fargate 是一项无服务器服务,可用于部署和管理容器,而无需管理物理服务器或虚拟机。
立即创建账户,开始在 AWS 上开发应用程序。