您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Docker与虚拟机有何不同?

Docker与虚拟机有何不同?

Docker最初使用LinuX容器(LXC),但后来切换到runC(以前称为 ),后者与主机运行在相同的操作系统中。这使它可以共享许多主机操作系统资源。此外,它使用分层文件系统(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映像(如果正确的话)比简单地部署到一致的生产环境更容易?

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

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

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

来自评论

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

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

其他 2022/1/1 18:15:05 有412人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶