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

时间:2018-07-14 22:10:00

标签: docker

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

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

3 个答案:

答案 0 :(得分:2)

  

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

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

  

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

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

  

有警告吗?

如上所述,包含依赖于最新内核功能的软件的Docker映像将无法在不具有这些功能的内核上运行,这不足为奇。 Docker不会阻止您在较旧的内核上运行这样的映像,因为它根本不在乎映像中的内容,也不知道使用哪个内核来创建映像。

我唯一想到的另一件事是针对特定的CPU(例如Intel或Amd)手动进行积极的优化编译软件。这样的映像将在具有不同CPU的主机上失败。

答案 1 :(得分:1)

  

这听起来好像主机运行的内核版本超出该最低要求无关紧要。这是真的吗?

只要您的内核满足Docker的最低要求(主要涉及拥有必要的API来支持Docker为每个容器设置的隔离执行环境),Docker就不会在乎您正在运行的内核。

从很多方面来说,这并不是一个完全由Docker带来的问题:在大多数情况下,用户空间工具并没有特别紧密地绑定到特定的内核版本。这不是单方面的事实。有一些工具可以通过设计与非常特定的内核版本进行交互,或者可以利用最新内核版本中的API来提高性能,但是在大多数情况下,您的Web服务器或数据库根本不在乎。

  

有警告吗?

您正在运行的内核版本可能会决定诸如Docker可以使用哪些存储驱动程序之类的事情,但这实际上对您的容器没有任何影响。

较旧的内核版本可能具有在较新版本中修复的安全漏洞,而较新的版本可能具有可提供更高性能的修复程序。

答案 2 :(得分:0)

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

容器内的特定软件可能与主机操作系统的内核一起工作,也可能不工作。使用早于为其构建软件的内核并不常见。通常,在较新的内核上运行较旧的软件是安全的。

更多但并非总是如此。在内核为4.19的主机(例如Ubuntu 18.04)上,尝试docker run centos:6 bash。您会发现它存在segfaults(退出代码139),因为旧版本的bash所做的事情极大地使较新的内核不满意。 (在4.9或更低版本的内核上,docker run centos:6 bash可以正常工作。)但是,docker run centos:6 ls不会以相同的方式消亡,因为该程序不依赖于已更改的特定内核功能(至少,不是当没有参数运行时。)