这里的大多数答案都是关于虚拟机的。我将给你们一个简单的回答,这个问题在过去几年使用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
为了这个!)。