当前位置: 首页 > 面试题库 >

Docker与虚拟机有何不同?

孙修贤
2023-03-14
问题内容

我不断阅读Docker文档,以尝试了解Docker和完整VM之间的区别。它如何提供完整的文件系统,隔离的网络环境等而又不那么繁重?

为什么将软件部署到Docker映像(如果是正确的说法)比简单地部署到一致的生产环境更容易?


问题答案:

Docker最初使用LinuX容器(LXC),但后来切换到runC(以前称为
libcontainer
),后者与主机运行在相同的操作系统中。这使它可以共享许多主机操作系统资源。此外,它使用分层文件系统(AuFS)并管理网络。

AuFS是分层的文件系统,因此您可以具有合并在一起的只读部分和写入部分。可以使操作系统的公共部分为只读(并在所有容器之间共享),然后为每个容器提供自己的安装架以进行写入。

因此,假设您有一个1 GB的容器映像;如果要使用完整的VM,则需要具有1 GB x所需数量的VM。使用Docker和AuFS,您可以在所有容器之间共享1
GB的大部分空间;如果您有1000个容器,则容器OS的空间可能仍然只有1 GB以上(假设它们都运行相同的OS映像) 。

完整的虚拟化系统会为其分配自己的资源集,并且共享最少。您将获得更多的隔离,但是隔离会更重(需要更多资源)。使用Docker可以减少隔离,但是容器重量轻(需要较少的资源)。因此,您可以轻松地在主机上运行数千个容器,并且它甚至不会闪烁。尝试使用Xen来做到这一点,除非您拥有非常庞大的主机,否则我认为不可能。

完整的虚拟化系统通常需要几分钟的时间来启动,而Docker / LXC / runC容器则需要数秒钟,甚至不到一秒钟。

每种类型的虚拟化系统各有利弊。如果要使用有保证的资源进行完全隔离,则必须使用完整的VM。如果您只是想将进程彼此隔离,并希望在合理大小的主机上运行大量进程,那么Doc​​ker
/ LXC / runC似乎是可行的方法。

有关更多信息,请查看这组博客文章,它们可以很好地解释LXC的工作原理。

为什么将软件部署到docker映像(如果正确的话)比简单地部署到一致的生产环境更容易?

部署一致的生产环境说起来容易做起来难。即使您使用Chef和Puppet之类的工具,也始终会在主机和环境之间进行OS更新以及其他更改。

Docker使您能够将操作系统快照到共享映像中,并使其易于部署在其他Docker主机上。在本地,dev,qa,prod等:全都相同。当然,您可以使用其他工具来做到这一点,但并不那么容易或快速。

这非常适合测试;假设您有成千上万个需要连接到数据库的测试,并且每个测试都需要数据库的原始副本,并将对数据进行更改。经典的方法是在每次测试后使用自定义代码或使用Flyway之类的工具重置数据库-
这可能非常耗时,并且意味着测试必须串行运行。但是,使用Docker可以创建数据库的映像并为每个测试运行一个实例,然后并行运行所有测试,因为您知道它们都将针对数据库的同一快照运行。由于测试是在Docker容器中并行运行的,因此它们可以同时在同一盒子上运行,并且应该更快地完成。尝试使用完整的VM进行操作。

来自评论…

有趣!我想我仍然对“快照操作系统”的概念感到困惑。如果不制作操作系统映像,该怎么办?

好吧,让我们看看是否可以解释。您从基础映像开始,然后进行更改,然后使用docker提交这些更改,然后创建一个映像。该图像仅包含与基准的差异。当您要运行映像时,您还需要基础,它使用分层的文件系统在基础之上分层映像:如上所述,Docker使用AuFS。AuFS将不同的层合并在一起,您将获得所需的内容。您只需要运行它。您可以继续添加越来越多的图像(图层),它将继续仅保存差异。由于Docker通常基于注册表中的现成映像构建,因此您几乎不必自己“快照”整个操作系统。



 类似资料:
  • 我不断地重读Docker文档,试图理解Docker和一个完整的VM之间的区别。它是如何提供完整的文件系统、独立的网络环境等而又不那么沉重的呢? 为什么将软件部署到Docker映像(如果这是正确的术语)比简单地部署到一致的生产环境更容易?

  • 查看虚拟机相关的监控告警信息。 监控菜单下的虚拟机页面主要用于查看虚拟机相关的监控告警信息。 入口:在云管平台单击左上角导航菜单,在弹出的左侧菜单栏中单击 “监控/资源/虚拟机” 菜单项,进入虚拟机页面。 查看虚拟机列表 该功能用于查看虚拟机的监控告信息。 在虚拟机页面,支持查看以下信息: 名称:虚拟机的名称。 IP:虚拟机的IP地址。 监控状态:虚拟机是否设置告警以及发生告警。 状态:虚拟机的当

  • 主机回收站用于存放用户删除的虚拟机和裸金属文件。 主机回收站用于存放用户删除的虚拟机和裸金属文件。回收站中主机文件默认保存3天,如有误删除的主机需要在3天内进行恢复操作,可以将其恢复到原来位置,超过3天后,文件将被彻底删除。 入口:在云管平台单击左上角导航菜单,在弹出的左侧菜单栏中单击 “主机/回收站/主机” 菜单项,进入主机回收站列表。 清除 当确定回收站中的主机无用后,可使用清除功能立即彻底删

  • 虚拟机是采用虚拟化技术构建的运行在宿主机上的虚拟机实例。 虚拟机是采用虚拟化技术构建的运行在宿主机上的虚拟机实例,包括CPU、内存、操作系统、硬盘、网卡等完整的虚拟硬件基础环境。 虚拟机来源: 当云管平台对接其他平台云账号后,将会自动同步其他平台上的虚拟机到云管平台上进行管理。 新建虚拟机。 入口:在云管平台单击左上角导航菜单,在弹出的左侧菜单栏中单击 “主机/主机/虚拟机” 菜单项,进入虚拟机页

  •  TJS2 は、スクリプトをいったん仮想マシン (TJS2 VM) 用のバイナリコードにコンパイルしてから実行します。  例外が発生したときやダンプを行ったときにこの TJS2 VM のコードの逆アセンブル結果が表示されるので、この仮想マシンについて簡単に説明します。 命令コード  TJS2 VM は関数やプロパティなどの実行単位ごとに独立していて、ある一つの関数が他の関数と命令コード空間、レジス

  • 稳定性: 2 - 稳定的 vm 模块提供了一系列 API 用于在 V8 虚拟机环境中编译和运行代码。 它可以通过以下方式使用: const vm = require('vm'); JavaScript 代码可以被编译并立即运行,或编译、保存然后再运行。 Note: The vm module is not a security mechanism. Do not use it to run un