一尘不染

Docker与虚拟机有何不同?

docker

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

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


阅读 283

收藏
2020-06-17

共1个答案

一尘不染

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映像(如果正确的话)比简单地部署到一致的生产环境更容易?

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

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

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

来自评论…

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

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

2020-06-17