如果容器没有来宾操作系统,为什么我们要在 Docker 中使用操作系统基础映像?

use*_*696 120 virtualization linux cloud virtual-machines docker

我刚刚开始学习 Docker,有些东西让我很困惑。正如我在 Docker 的网站上所读到的,容器不同于虚拟机。据我所知,容器只是一个沙箱,在其中运行整个隔离的文件系统。

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

所有这些都很好。我感到困惑的是,有一些以操作系统命名的 Docker 镜像。我们看到像 Ubuntu、Debian、Fedora、CentOS 等镜像。

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

我认为容器没有安装来宾操作系统,但是当我们创建映像时,我们将它们基于某个以一个操作系统命名的映像。

此外,在我看到的示例中,我们docker run ubuntu echo "hello world"似乎正在使用 Ubuntu 启动 VM 并使其运行命令echo "hello world"

以同样的方式,当我们这样做时docker run -it ubuntu /bin/bash,似乎我们正在使用 Ubuntu 启动虚拟机并使用命令行访问它。

无论如何,这些以操作系统命名的图像是关于什么的?使用其中一个映像运行容器并使用相应的来宾操作系统启动 VM 有什么不同?

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

dro*_*kie 86

由于所有 Linux 发行版都运行相同的(是的,它有点简化)Linux 内核,并且仅在用户空间软件上有所不同,因此模拟不同的发行版环境非常容易——只需安装该用户空间软件并假装它是另一个发行版。具体来说,在 Ubuntu 操作系统中安装 CentOS 容器意味着您将从 CentOS 获得用户空间,同时仍然运行相同的内核,甚至不是另一个内核实例。

所以轻量级虚拟化就像在同一个操作系统中拥有隔离的隔间。相反,真正的虚拟化是在主机操作系统中拥有另一个成熟的操作系统。这就是 docker 不能在 Linux 中运行 FreeBSD 或 Windows 的原因。

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

  • 所以这就是为什么我可以在空的 Scratch 容器中托管我编译的 golang 代码 - 因为编译的代码只需要内核? (3认同)