我正在阅读此Docker教程:
请务必注意,Docker容器不在自己的虚拟机中运行,而是共享Linux内核。与虚拟机相比,容器使用更少的内存和更少的CPU。
但是,Docker需要Linux运行时。在非Linux平台(例如macOS和Windows 10)上的实现使用单个Linux虚拟机。容器共享此系统。
我想知道linux内核和linux运行时之间有什么区别。
我发现的内核定义:
内核是操作系统的最低级别。内核是操作系统的主要部分,负责将命令转换为计算机可以理解的内容。
我发现的运行时定义:
运行时是程序正在运行(或可执行)的时间。也就是说,当您启动在计算机上运行的程序时,该程序就是该程序的运行时。在某些编程语言中,某些可重用程序或“例程”被构建并打包为“运行时库”。这些例程可以在任何程序运行时链接到并由任何程序使用。
答案 0 :(得分:2)
tl; dr:没什么区别,Linux内核是一种运行时。
详细说明:
引用的定义不是“运行时”的很好定义。在软件构建环境中,运行时是指软件将您构建的软件,解释并执行的指令(逐项)执行。
例如,当您为Java构建jar文件时,它们包含名为“ Java字节码”的语言的指令,而在Java程序运行时执行这些指令的运行时就是JVM。
编写Python脚本时,执行这些Python指令的运行时就是Python解释器。
运行时还具有将程序从文件加载到可以解释的形式的作用。
在C语言中构建程序时,该程序将编译为机器代码,该代码不会由任何软件解释,而是直接由硬件(CPU)解释。此类程序有时称为“本机”。但是,C标准库通常不与您的软件捆绑在一起,它们必须独立存在于运行您的代码的计算机上,并且有时也称为“ C运行时”,部分原因是它们包含每个C程序的引导程序代码
即使这样的本机程序也被编译成本机可执行格式(Linux使用的一种称为ELF),并且OS内核必须知道如何将该格式读入指令并以CPU可以解释&加载的方式加载它们。执行它们。因此,操作系统也是运行时。 (请注意,虽然OS内核是OS的主程序,但通常其他程序也是该运行时的一部分,例如动态链接器。)
如您所见,运行时通常是堆叠在一起的:您可以拥有运行MacOS内核的Intel x86硬件,运行管理程序的虚拟机管理程序,运行JVM的Linux虚拟机。
现在,您将遇到的所有docker镜像都是基于Linux的。这些映像中安装的所有本机程序,包括JVM和Python解释器之类的运行时,都是为Linux编译的本机程序(即ELF可执行文件)。
在Linux中运行docker容器时,需要发生两件事:
首先,docker需要设置一个容器(设置诸如覆盖文件系统和控制组之类的东西)。
第二,docker需要以某种方式在容器中获取某些(ELF)可执行文件(例如JVM或本地容器化的C程序)才能运行。
这两种情况都属于“程序加载”类别,这是运行时的职责。
Linux是唯一具有所有这些功能的操作系统内核-覆盖文件系统,控制组和ELF加载-由docker使用。
例如在MacOS上,这些技术不存在(AFAICT),因此,要运行docker容器,docker需要在Linux虚拟机中运行其容器,该虚拟机充当可以加载映像的运行时。