我还读到一个容器没有安装Guest OS。相反,它依赖于底层OS内核。
这一切都很好。我感到困惑的是,有以操作系统命名的Docker映像。我们看到的图像有Ubuntu,Debian,Fedora,CentOS等。
我的意思是:这些图像是什么?
我认为容器没有安装来宾OS,但是基于Debian映像创建容器和安装Debian有什么不同?在一个操作系统之后。
在示例中,我看到当我们执行
docker run ubuntu echo "hello world"
时,似乎我们正在用Ubuntu旋转VM,并使其运行命令
echo "hello world"
。 以同样的方式执行
docker run -it ubuntu /bin/bash
时,似乎我们正在使用Ubuntu旋转VM,并使用命令行对其进行访问。无论如何,以这些命名的图像是什么?操作系统全部有关?用这些映像之一运行容器并用相应的来宾OS分解VM有何不同?
我们只是与主机OS共享内核的想法(因此我们有了访问底层机器硬件资源,而无需虚拟化硬件),但仍使用容器上每个不同系统的文件和二进制文件来支持我们要运行的任何应用程序?
#1 楼
由于所有Linux发行版都运行相同的(是的,略有简化)Linux内核,并且仅在用户级软件方面有所不同,因此模拟不同的发行环境非常容易-只需安装该用户级软件并假装它是另一个发行版即可。具体来说,在Ubuntu OS中安装CentOS容器意味着您将从CentOS获得用户身份,同时仍在运行相同的内核,甚至没有另一个内核实例。因此,轻量级虚拟化就像在内部隔离隔间相同的操作系统。相反,真正的虚拟化是在主机OS中拥有另一个成熟的OS。这就是docker无法在Linux内运行FreeBSD或Windows的原因。
如果这样更容易,您可以认为docker是一种非常复杂且高级的chroot环境。
评论
所以这就是为什么我可以在空的Scratch容器中托管我的已编译golang代码的原因-因为已编译的代码仅需要内核?
–弗朗西斯·诺顿(Francis Norton)
16年11月4日,9:47
那么,来宾操作系统如何知道使用主机操作系统的内核(以及如何使用)? AFAIK,docker镜像库使用标准OS镜像。在您的示例中,这不是像有一个知道使用父级内核的自定义CentOS构建吗?还是像Docker将来宾(CentOS')对/ boot的读取重定向到主机(Ubuntu)的文件系统(aufs)技巧一样简单?在这种情况下,guest虚拟机(CentOS)将安装其自己的/ boot副本,但是它永远不会被读取?
–詹姆斯·S
17-10-4在14:42
我喜欢您的解释,但是您如何解释在Windows上运行Linux容器? Server 2016和Windows 10是否包含Linux内核以启用Docker?这就是为什么需要这些版本吗?
–duct_tape_coder
19年1月24日在21:32
这很简单:它们只是在本机Linux VM内的完整Hyper-V虚拟化堆栈下运行:docs.microsoft.com/en-us/virtualization/windowscontainers/…。
–drookie
19年1月25日在5:08
@duct_tape_coder。 Docker将使用Hyper-V技术在您的Windows顶部安装Linux内核
– QuadSquad
20-2-2在12:03
#2 楼
容器在单个内核上运行。换句话说,所有容器都具有单个内核(主机操作系统)。另一方面,管理程序具有多个核心。每个虚拟机在不同的内核上运行。“ docker run ubuntu”就像创建chroot环境一样。
#3 楼
我一直在与您所问的相同问题苦苦挣扎,这就是我已经理解的问题。容器没有来宾操作系统,您说得对。
然后为什么我们是否将容器基于OS映像?
因为您要使用一些命令(如apt,ls,cd,pwd)。
这些命令是对二进制文件的调用,这些文件可能对您有用在主机操作系统中无需安装任何程序。
为了能够在docker映像中运行这些命令,您必须在映像中包含它们的二进制文件,因为隔离,您不只是从以下位置执行二进制文件主机操作系统。
请参阅以下答案,以更好地了解我们为什么甚至需要基本映像:https://stackoverflow.com/a/62384611
评论
我认为,虚拟化的目标是关键。如果您在OS上需要库,语言等,那么OS容器就可以满足您的需求。但是,如果您仅需要将应用程序作为组件,则不必将OS用作基础映像。我认为这篇文章可以清楚地解释它blog.risingstack.com / ...