tl;dr:没有区别,Linux 内核是一种运行时。
详细解释:
运行时
引用的定义不是“运行时”的一个很好的定义。在软件构建上下文中,运行时是软件获取您构建的软件,对其进行解释并(通常)逐条执行它。
例如,当您为 Java 构建 jar 文件时,它们包含一种称为“Java 字节码”的语言的指令,而在 Java 程序运行时执行这些指令的运行时是 JVM。
当您编写 Python 脚本时,执行这些 Python 指令的运行时是 Python 解释器。
操作系统和加载
运行时还具有将程序从文件加载到可以解释的形式的作用。
当您用 C 语言构建程序时,它会被编译为机器代码,该机器代码不被任何软件解释,而是直接由硬件 (CPU) 解释。这样的程序有时被称为“本机”。但是,C 标准库通常不与您的软件捆绑在一起,它们必须独立存在于运行您的代码的机器上,这些有时也称为“C 运行时”,部分原因是它们包含每个 C 程序的引导代码.
即使是这样的本机程序也被编译成本机可执行格式(Linux 使用的称为 ELF),操作系统内核必须知道如何将该格式读入指令并以 CPU 可以解释的方式加载它们 &执行它们。因此,操作系统也是运行时。 (请注意,虽然 OS 内核是 OS 的主程序,但通常其他程序也是此运行时的一部分,例如动态链接器。)
如您所见,运行时通常是堆叠的:您可以让 Intel x86 硬件运行 MacOS 内核,运行虚拟机管理程序,运行运行 JVM 的 Linux 虚拟机。
Docker 运行时
现在,您将遇到的所有 docker 映像都是基于 Linux 的。这些镜像中安装的所有本机程序,包括 JVM 和 Python 解释器等运行时,都是为 Linux 编译的本机程序(即 ELF 可执行文件)。
在 Linux 中运行 docker 容器时,需要发生两件事:
首先,docker 需要设置一个容器(设置诸如覆盖文件系统和控制组之类的东西)。
其次,docker 需要以某种方式让容器中的一些 (ELF) 可执行文件(例如 JVM 或您的本机容器化 C 程序)运行。
这两件事都归于“程序加载”类别,这是运行时的责任。
Linux 是唯一具有所有这些功能的操作系统内核 - 覆盖文件系统、控制组和 ELF 加载 - 由 docker 使用。
在例如MacOS,这些技术不存在(AFAICT),因此为了运行 docker 容器,docker 需要在 Linux 虚拟机中运行其容器,该虚拟机充当可以加载图像的运行时。