【发布时间】:2017-07-18 21:33:05
【问题描述】:
“docker”是近来的一个流行词,我试图弄清楚它是什么以及它是如何工作的。更具体地说,它与普通 VM(例如 VirtualBox、HyperV 或 WMWare 解决方案)有何不同。
文档的介绍部分 (https://docs.docker.com/get-started/#a-brief-explanation-of-containers) 内容如下:
容器在主机内核上本地运行应用程序。它们比仅通过管理程序获得对主机资源的虚拟访问的虚拟机具有更好的性能特征。容器可以获得本机访问,每个容器都在一个离散的进程中运行,占用的内存不超过任何其他可执行文件。
宾果!这就是区别。容器直接运行在托管操作系统的内核上,这就是为什么它们如此轻量和快速(加上它们提供进程隔离和 docker hub 形式的良好分布机制,这与容器相互连接的能力很好) .
但请稍等。我可以使用 docker 在 Windows 上运行 Linux 应用程序 - 怎么可能?当然,有一些虚拟机。否则我们就无法完成工作......
好的,但是当我们在 Linux 主机上工作时会是什么样子???真正的混乱来了……仍然有人将操作系统定义为我们想要创建的每个映像的基础映像。即使我们说“从头开始” - 从头开始仍然是一些极简内核......所以来了
问题 1:如果我跑步,例如CentOS主机,我可以创建容器,直接使用这个主机操作系统的内核(而不是VM,它包括它自己的操作系统)吗?如果是,我该怎么做?如果不是,为什么 docker 的文档对我们撒谎(因为 docker 镜像总是在某个 VM 中运行,并且与其他 VM 并没有太大区别,或者是不是?)?
经过一番思考并环顾四周,我想知道是否对运行图像进行了一些优化。来了
问题2:如果我运行两个容器,这两个容器的图像都基于同一个父图像,这个父图像会只加载到内存中一次吗?每个容器会有一个虚拟机,还是只有一个虚拟机运行两个容器?如果我们使用不同的操作系统呢?
第三个问题比较靠谱:
问题 3:是否有一些资源,描述了这类事情......因为大多数讨论 docker 的文章只是告诉“它太酷了,你一定要使用 ut . 只需运行一个命令就可以开心了”...这并没有过多解释。
谢谢。
【问题讨论】:
-
感谢您的链接(这是对问题 3 的直接回答,对于问题 1 和问题 2 是隐含的)。总结问题 1 和 2 的答案:似乎在 Linux 上没有 VM。相反,Linux 内核是共享的,并且使用分层 FS 可以在其之上逐步构建(此时我对使用共享相同内核的不同发行版的可能性感到困惑)......
-
两个后续问题: 1、内核版本匹配是怎么做的?如果我在没有最新内核的主机上运行 docker,然后尝试在那里运行使用最新 kerenl 功能的软件,会发生什么? 2.问题2(来自原始问题)对于windows仍然有效:有多少VM实例正在运行?是所有 Docker 容器的单个实例还是每个容器的新 VM 实例?
-
@DmitriiSemikin 1. 它会坏掉;它在较旧的内核上运行。 2. 一般情况下,所有容器都是一个VM实例。
-
@DmitriiSemikin 实际上,我已经编辑了我的答案,以包含对您后续问题的更详细的答案。但是最好编辑您的问题以包含后续问题,这样人们就不会错过它们。
标签: docker