简而言之:Linux内核是一种运行时,与其他操作系统的运行时没有区别。
长话短说:
运行时
引用的定义并不是“运行时”的定义。在软件构建的背景下,运行时是指将您构建的软件解释并逐条执行(通常)的软件。
例如,当您为Java构建jar文件时,它们包含用一种称为“Java字节码”的语言编写的指令,执行这些指令的运行时是JVM。
当您编写Python脚本时,执行这些Python指令的运行时是Python解释器。
操作系统和加载
运行时还有从文件中加载程序并以可解释的形式呈现的作用。
当您在C中构建程序时,它会被编译成机器代码,由硬件(CPU)直接执行,不需要任何软件进行解释。这样的程序有时被称为“本地”程序。但是,C标准库通常不随软件捆绑在一起,必须独立存在于运行代码的机器上,并且它们有时也被称为“C运行时”,部分原因是它们包含每个C程序的引导代码。
即使这样的本机程序也被编译为本地可执行格式(Linux使用的称为ELF),操作系统内核必须知道如何读取该格式并以CPU可以解释和执行的方式加载它们。因此,操作系统也是运行时。(请注意,尽管操作系统内核是操作系统的主程序,但通常其他程序也是这个运行时的一部分,例如动态链接器。)
正如您所看到的,运行时经常是堆叠的:您可以在Intel x86硬件上运行MacOS内核,在运行虚拟机程序的Linux虚拟机。
Docker运行时
现在,您遇到的所有Docker镜像都是基于Linux的。其中包括JVM和Python解释器等运行时的所有本机程序,均为针对Linux编译的本机程序(即ELF可执行文件)。
在Linux中运行docker容器时,需要完成两件事:
首先,docker需要设置容器(设置覆盖文件系统和控制组等内容)。
其次,docker需要以某种方式获得一些(ELF)可执行文件(例如JVM或本机容器化的C程序)以运行。
这两件事都属于“程序加载”类别,这是运行时的职责之一。
Linux是唯一具有这些功能的操作系统内核-覆盖文件系统、控制组和ELF加载-这些功能被docker利用。
在MacOS等操作系统上,这些技术不存在(据我所知),因此为了运行docker容器,docker需要在Linux虚拟机中运行其容器,该虚拟机作为可以加载映像的运行时。