Py学习  »  L0j1k  »  全部回复
回复总数  1
9 年前
回复了 L0j1k 创建的主题 » VM的Guesto和Docker的Basic Image有什么区别?

这里的大多数答案都是关于虚拟机的。我将给你们一个简单的回答,这个问题在过去几年使用Docker对我帮助最大。是这样的:

Docker只是一种运行进程的奇特方式,而不是虚拟机。

现在,让我进一步解释一下这意味着什么。虚拟机是它们自己的野兽。我想解释一下 is将帮助您理解这一点,而不仅仅是解释虚拟机是什么。尤其是因为这里有很多很好的答案,告诉你某人说“虚拟机”时的确切意思。所以

Docker容器只是一个使用 cgroups 在主机系统的内核中从其他进程中分离出来。通过运行 ps aux 在主机上。例如,开始 apache2 “容器中”才刚刚开始 apache2 作为主机上的特殊进程。它只是与机器上的其他过程分开。重要的是要注意,容器在容器化流程的生命周期之外不存在。当进程终止时,容器也将终止。那是因为Docker取代了 pid 1 将应用程序放入容器中( 通常是init系统)。最后一点是关于 pid 1 这非常重要。

对于每个容器进程使用的文件系统,Docker使用 UnionFS -备份的图像,这是您在进行备份时下载的图像 docker pull ubuntu .每个“图像”只是一系列层和相关元数据。分层的概念在这里非常重要。每一层只是它下面的一层的变化。例如,当您在构建Docker容器时删除Docker文件中的一个文件时,实际上您只是在最后一层的顶部创建了一个层,上面写着“此文件已被删除”。顺便说一句,这就是为什么可以从文件系统中删除一个大文件,但映像仍然占用相同的磁盘空间。文件仍然在那里,在当前文件下面的层中。层本身只是文件的tarball。你可以用 docker save --output /tmp/ubuntu.tar ubuntu 然后 cd /tmp && tar xvf ubuntu.tar .然后你可以四处看看。所有那些看起来像长散列的目录实际上都是单独的层。每一个都包含文件( layer.tar )和元数据( json )关于那个特定层的信息。这些层只描述对文件系统的更改,这些更改被保存为“在”其原始状态之上的层。当读取“当前”数据时,文件系统读取数据时,就好像它只查看最顶层的更改一样。这就是为什么文件似乎被删除了,尽管它仍然存在于“之前”的层中,因为文件系统只查看最顶层。这允许完全不同的容器共享它们的文件系统层,即使每个容器最顶层的文件系统可能发生了一些重大变化。当容器共享其基本图像层时,这可以节省大量磁盘空间。但是,当您通过卷将目录和文件从主机系统装载到容器中时,这些卷会“绕过”UnionFS,因此更改不会存储在层中。

Docker中的网络是通过使用以太网桥(称为 docker0 主机上),以及主机上每个容器的虚拟接口。它会在中创建一个虚拟子网 docker0 让你的容器相互“交流”。这里有很多联网选项,包括为容器创建自定义子网,以及“共享”主机的联网堆栈以供容器直接访问的功能。

Docker进展得很快。它的 documentation 是我见过的最好的文档之一。它通常写得很好、简洁、准确。我建议您查看可用的文档以了解更多信息,并相信这些文档胜过您在网上阅读的任何其他内容,包括堆栈溢出。如果你有具体问题,我强烈建议你加入 #docker 在Freenode IRC上并在那里询问(你甚至可以使用Freenode的 webchat 为了这个!)。