为什么Docker能够运行不同的Linux发行版?

91
我们可以使用Docker拉取不同的镜像。这些镜像是不同的Linux发行版。但无论Docker运行在哪个Linux发行版上,Docker都可以像在虚拟机中一样运行这些不同的Linux发行版。
我知道Docker使用aufs来控制不同的读写访问级别。因此它可以重复使用主机上的某些文件。但是当我的主机运行arch linux时,Docker如何在容器中运行apt-get呢?镜像是否包含apt-get二进制文件?但是不同的Linux发行版具有不同的库和软件版本。甚至配置文件也不同。那么Docker如何在arch linux上“运行”ubuntu呢?

4
标记为理论。这是关于操作系统和Docker低级实现的一个有效问题。 - Regan
2个回答

108
因为内核是相同的。
所有Linux发行版的共同点,也是它们被称为Linux的原因,是因为它们都使用Linux内核。
容器与主机共享同一个内核,这就是为什么在Ubuntu主机上可以运行Arch镜像的原因。
以下是Linux的概述。
内核是操作系统的一部分,处理与硬件的通信。它是操作系统的最低层。以下是内核的主要功能列表:
- 内存管理 - 网络管理 - 设备驱动程序 - 文件管理 - 进程管理
因此当您使用容器时,只能访问主机的内核,因为它是唯一与硬件通信的部分,只要您的操作系统使用了正确的syscall,您就能在容器内运行任何Linux发行版。(这就是为什么您无法在容器中使用Windows的原因:它没有使用相同的syscall。)

8
运行一个 Ubuntu Docker 镜像就是在 Linux 内核之上运行 Ubuntu 所有的操作,对吗? - lajarre
7
并不完全准确。它并不运行所有的东西(虽然从技术上讲它可以),基本的Ubuntu映像只运行最少的必要内容来使Ubuntu工作。 - Regan
12
@Regan,Docker如何处理不同Linux内核版本之间的差异? - Hammer
5
不是的,所有容器都运行在同一个内核上。不同发行版之间最大的区别在于用户空间(应用、库、文件系统、包管理器),每个容器都包含其自己的版本。但也有例外,比如 Redis 数据库,在这种情况下内核的差异确实很重要。 - MauganRa
这个答案错误地颠倒了OP在Arch和Ubuntu中的角色。 - Tommy

5
是的,为了能够运行apt-get,这些镜像必须包含apt-get。每个镜像可以安装不同的软件。因此,您可以安装Arch docker image或ubuntu镜像。您可以使用以下命令搜索公共镜像。
docker search <your search term>

所以,如果要搜索Ubuntu镜像,您可以使用以下命令:
docker search ubuntu

我建议您跟随 Docker 教程,并在学习过程中仔细阅读左侧的所有指令和链接。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接