如果容器没有来宾OS,为什么我们在Docker上使用OS Base Image?


83

我刚刚开始研究Docker,这让我有些困惑。正如我在Docker网站上阅读的那样,容器与虚拟机不同。据我了解,容器只是一个沙箱,在其中运行了整个隔离的文件系统。

我还读到一个容器没有安装来宾操作系统。相反,它依赖于底层OS内核。

一切都很好。我感到困惑的是,有以操作系统命名的Docker映像。我们看到诸如Ubuntu,Debian,Fedora,CentOS等映像。

我的意思是:这些图像是什么?基于Debian映像创建容器与创建虚拟机并安装Debian有何不同?

我以为容器没有安装Guest OS,但是当我们创建映像时,我们将它们基于以一个OS命名的某个映像。

另外,在我看到的示例中docker run ubuntu echo "hello world",似乎我们正在使用Ubuntu来旋转VM,并使其运行command echo "hello world"

用与我们执行操作相同的方式docker run -it ubuntu /bin/bash,似乎我们正在使用Ubuntu来启动VM,并使用命令行对其进行访问。

无论如何,那些以操作系统命名的映像是什么?使用这些映像之一运行容器并使用相应的来宾OS启动VM会有何不同?

这个想法是我们与主机操作系统共享内核(因此,我们可以访问底层机器硬件资源,而无需虚拟化硬件),但仍按顺序使用容器上每个不同系统的文件和二进制文件支持我们想要运行的任何应用程序?


2
我认为,您的虚拟化目标是关键。如果您在OS上需要库,语言等,那么OS容器就可以满足您的需求。但是,如果您仅需要将应用程序作为组件,则不必将OS用作基础映像。我觉得这篇文章可以解释清楚blog.risingstack.com/...
的Metamorph

Answers:


68

由于所有Linux发行版都运行相同的(是的,略微简化了)Linux内核,并且仅在用户级软件方面有所不同,因此模拟不同的发行环境非常容易-只需安装该用户级软件并假装它是另一个发行版即可。具体来说,在Ubuntu OS中安装CentOS容器意味着您将从CentOS获得用户身份,同时仍在运行相同的内核,甚至没有运行另一个内核实例。

因此,轻量级虚拟化就像在同一OS中具有隔离的隔离专区。相反,真正的虚拟化是在主机OS中拥有另一个成熟的OS。这就是为什么docker无法在Linux内运行FreeBSD或Windows的原因。

如果这样更容易,您可以认为docker是一种非常复杂且高级的chroot环境。


3
所以这就是为什么我可以在空的Scratch容器中托管我的已编译golang代码的原因-因为已编译的代码只需要内核?
弗朗西斯·诺顿

那么,来宾操作系统如何知道使用主机操作系统的内核(以及如何使用)?AFAIK,docker镜像库使用标准OS镜像。在您的示例中,并不是像有一个知道使用父级内核的自定义CentOS构建?还是像Docker将来宾(CentOS')对/ boot的读取重定向到主机(Ubuntu)的文件系统(aufs)技巧一样简单?在这种情况下,guest虚拟机(CentOS)将安装其自己的/ boot副本,但是它永远不会被读取?
James S

我喜欢您的解释,但是您如何解释在Windows上运行Linux容器?Server 2016和Windows 10是否包含Linux内核以启用Docker?这就是为什么这些版本是必需的吗?
pipe_tape_coder

这很简单:它们仅在本地Linux VM内的完整Hyper-V虚拟化堆栈下运行:docs.microsoft.com/en-us/virtualization/windowscontainers/…
drookie

1

容器在单个内核上运行。换句话说,所有容器都具有单个内核(主机操作系统)。另一方面,管理程序具有多个核心。每个虚拟机都在不同的内核上运行。

而且“ docker run ubuntu”就像创建chroot环境一样。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.