Docker如何处理不同的内核版本?

Wes*_*ger 6 docker

假设我为使用版本10内核的OS制作了一个映像,如果我在运行版本9内核的主机OS上为该映像运行一个容器,那么Doc​​ker会表现出什么行为?那版本11呢?

版本的向后兼容性重要吗?我出于好奇而问,因为文档仅讨论“最低Linux内核版本”等。这听起来像主机运行的内核版本超出该最低值无关紧要。这是真的?有警告吗?

Eri*_*erg 6

假设我为使用版本 10 内核的操作系统制作了一个映像。

我认为这有点误解,除非您谈论的是依赖于 Docker 映像中较新内核功能的特定软件,这种情况应该很少见。一般来说,Docker 镜像只是一个自定义的文件/目录结构,通过一个或多个 中的指令FROMRUN指令按层组装Dockerfiles,并带有一些元数据,例如要打开的端口或在容器启动时执行的文件。这就是它的全部内容。Docker 的基本原理非常像一个经典的chroot jail,只是更现代一点,并在上面放了一些糖果。

如果我在运行版本 9 内核的主机操作系统上为该映像运行容器,Docker 会表现出什么行为?11版呢?

如果内核可以运行 Docker 守护进程,它应该能够运行任何镜像。

有注意事项吗?

如上所述,包含依赖前沿内核功能的软件的 Docker 映像将无法在没有这些功能的内核上运行,这应该不足为奇。Docker 不会阻止您在较旧的内核上运行这样的映像,因为它根本不关心映像中的内容,也不知道使用什么内核来创建映像。

我唯一能想到的另一件事是手动编译软件,并针对 Intel 或 Amd 等特定 CPU 进行积极优化。此类映像将在具有不同 CPU 的主机上失败。

  • 是的,如果映像内的软件依赖于特定的内核功能,那么用户需要确保每个主机内核也启用这些功能。Docker 是进程隔离,而不是模拟。 (3认同)
  • _如果内核可以运行 Docker 守护进程,它应该能够运行任何映像。_ 完全不能。这完全取决于镜像中的软件。在内核 4.19 或更高版本(例如 Ubuntu 18.04)上尝试“docker run centos:6 bash”,它将退出并显示代码 139(段错误)。从同一个图像运行“ls”可以正常工作。 (2认同)

Cur*_*son 6

Docker 的行为没有什么不同:它不(直接)关心容器化进程的行为。Docker 所做的就是为进程设置各种参数(根文件系统、其他挂载、网络接口和配置、单独的命名空间或对可以看到的 PID 的限制等),让您将其视为“容器”,然后它只是在该环境中运行初始进程。

容器内的特定软件可能会或可能不会与您的主机操作系统的内核一起工作。使用比软件构建时更旧的内核经常会出现问题。更多情况下,在较新的内核上运行较旧的软件是安全的。

更多时候,但并非总是如此。在内核为 4.19 的主机(例如 Ubuntu 18.04)上尝试docker run centos:6 bash. 您会发现它存在段错误(退出代码 139),因为旧版本的bash做了一些让新内核非常不高兴的事情。(在 4.9 或更低版本的内核上,docker run centos:6 bash可以正常工作。)但是,docker run centos:6 ls不会以同样的方式终止,因为该程序不依赖于已更改的特定内核设施(至少在不带参数运行时不依赖)。