我刚刚开始研究 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 的虚拟机并使用命令行访问它。
那么,这些以操作系统命名的镜像到底是什么呢?使用其中一个镜像运行容器和使用相应的客户操作系统启动虚拟机有何不同?
我们的想法是只是与主机操作系统共享内核(因此我们可以访问底层机器硬件资源,而无需虚拟化硬件),但仍然使用容器上每个不同系统的文件和二进制文件来支持我们想要运行的任何应用程序?
答案1
由于所有 Linux 发行版都运行相同的(是的,它有点简化)Linux 内核,并且仅在用户空间软件方面有所不同,因此很容易模拟不同的发行版环境 - 只需安装该用户空间软件并假装它是另一个发行版。具体来说,在 Ubuntu 操作系统中安装 CentOS 容器意味着您将从 CentOS 获得用户空间,同时仍然运行相同的内核,甚至不是另一个内核实例。
所以轻的虚拟化就像在同一个操作系统中拥有独立的隔间。相反,真正的虚拟化是在主机操作系统中拥有另一个成熟的操作系统。这就是为什么 docker 不能在 Linux 中运行 FreeBSD 或 Windows。
如果这样更容易的话,您可以认为 docker 是一种非常复杂和先进的 chroot 环境。
答案2
我一直在思考和你一样的问题,现在我明白了这一点。
容器没有客户操作系统,这一点你是对的。
那么为什么我们要基于操作系统映像来创建容器呢?
因为您想使用一些命令,例如(apt、ls、cd、pwd)。这些命令是对二进制文件的调用,这些文件可能在您的主机操作系统中可用,而无需您安装任何东西。为了能够在 docker 镜像中运行这些命令,您必须在镜像中拥有它们的二进制文件,因为隔离,您不能只从主机操作系统执行二进制文件。
请参阅此答案以更好地理解为什么我们甚至需要基础图像:https://stackoverflow.com/a/62384611
答案3
容器在单内核上运行。换句话说,所有容器都有单内核(主机操作系统)。而另一方面,虚拟机管理程序有多个内核。每个虚拟机在不同的内核上运行。
而“docker run ubuntu”就好比创建chroot环境。
答案4
为了更清楚地解释@drookie 的回答:
- 因此,当你安装 Docker 桌面时,通常它安装了一个 Linux VM在其上运行容器。
在 macOS/windowsOS 上,安装后Docker 桌面,它安装了运行 Docker Engine 的 Linux VM。
为了更加深入地阐明:Docker Desktop 为开发人员提供的一些神奇功能包括:
- 运行 Linux 工具和容器的安全、优化的 Linux VM
- 无缝接入主机操作系统,使容器能够访问文件系统和网络
- 捆绑容器工具,包括 Kubernetes、Docker Compose、buildkit、扫描
- Docker Dashboard 用于可视化管理所有容器内容
- 适用于 Mac 和 Windows 的简单一键安装程序
- 预先配置合理且安全的默认值
- 自动增量更新,保证您的系统安全运行
如果您直接在操作系统上安装 docker-engine,它将使用相同的 HOST Linux 内核。