为什么需要Docker多体系结构(而不是Docker引擎抽象差异) 短版

为什么需要Docker多体系结构(而不是Docker引擎抽象差异) 短版,docker,cpu-architecture,docker-image,docker-engine,Docker,Cpu Architecture,Docker Image,Docker Engine,我想知道为什么需要为多个体系结构创建Docker映像的技术原因。此外,这里的要点是为每个CPU体系结构还是为操作系统创建映像,这一点尚不清楚。操作系统不应该抽象体系结构吗 长版本 我可以理解为什么Docker引擎必须移植到多个体系结构。它是一个软件,它将与操作系统交互,进行系统调用,最终它只是一个代码,在特定的指令集中,对于特定的体系结构,它被表示为一系列指令。因此,Docker引擎必须移植到多个OS/体系结构,就像Microsoft Word一样 同样的事情也会发生在JVM或VirtualBo

我想知道为什么需要为多个体系结构创建Docker映像的技术原因。此外,这里的要点是为每个CPU体系结构还是为操作系统创建映像,这一点尚不清楚。操作系统不应该抽象体系结构吗

长版本 我可以理解为什么Docker引擎必须移植到多个体系结构。它是一个软件,它将与操作系统交互,进行系统调用,最终它只是一个代码,在特定的指令集中,对于特定的体系结构,它被表示为一系列指令。因此,Docker引擎必须移植到多个OS/体系结构,就像Microsoft Word一样

同样的事情也会发生在JVM或VirtualBox上

但是,与Docker不同,为Windows上的JVM编写的软件将在Linux上运行。JVM将抽象底层操作系统/体系结构的差异,并在两个平台上运行相同的代码

为什么Docker图像不是这样?为什么Docker引擎不能抽象出差异,并提供一个通用接口,这样映像本身就不需要与特定的OS/体系结构兼容

这是一个决定(比如“让我们为每个架构制作不同的图像,因为它更适合于理由X”),还是Docker工作方式的结果(比如“我们需要这样做,因为Docker需要Y”)

  • 我不是在哭“天哪,为什么??”。这不是咆哮或批评,我只是想从技术上解释不同的架构需要不同的图像
  • 我不是问如何创建一个多架构的形象
  • 我不是在寻找一个像“需要多体系结构映像以便可以在各种平台上运行映像”这样的答案,它回答了“为什么要这样做?”,而不是“为什么需要这样做?”(这是我的问题)
除此之外,当您看到图像时,摘要中通常有一个
os/arch
,如下所示:

图像的目标是什么?操作系统、体系结构,还是两者兼而有之?操作系统不应该抽象底层架构吗


编辑:我开始假设每个体系结构需要不同的图像:图像将包含其中的应用程序。比方说,它将包含Go编译器。Go编译器本身是一个二进制文件,必须符合不同的体系结构。
x86-64
的图像将包含编译为
x86-64
的Go编译器,依此类推。这是正确的吗?如果这是正确的,这是唯一的原因吗

为什么Docker引擎不能抽象出差异,并提供一个公共接口

表现将是一个主要因素。考虑CygWin是如何慢一些时,当提供POSIX API在Windows之上通过模拟一些POSIX的事情,不直接映射到Windows API。(例如,
fork()
/exec,而不是CreateProcess)

这只是源代码兼容性;生成的二进制文件特定于Windows上的Cygwin。如果希望在运行时(二进制兼容而不是源兼容)执行此操作,则情况更糟


Docker还需要在各种操作系统之上提供一个高效的可移植JIT编译VM,特别是在各种CPU ISA之间,比如x86-64和AArch64,它们甚至不共享公共机器代码

如果Docker走了这条路,它实际上只是在重新发明一个基于JVM或.NETCLR字节码的虚拟机


或者更可能的情况是,与其重新发明这个轮子,不如使用现有的虚拟机,并在上面添加映像管理。但是,它无法处理用C编写的本机程序,除非它将它们传输到Java或CLR字节码。

在您安装的包的名称中,为不同的体系结构使用相同的基本映像可能会有很大的不同。示例centos 7:在intel上是一个名为llvm-toolset-7的包,在ppc64le上称为llvm-toolset-7.0。这种情况经常发生。一些回购协议甚至没有针对特定体系结构的软件包。这是一个不可能抽象出来的任务。谢谢,但我仍然不明白实际的区别。您提供了一个关于不同体系结构的软件包名称的答案,但我不知道这与操作系统有什么关系(操作系统是否根据基础体系结构下载不同的软件包?),以及不同体系结构的软件包之间的实际区别是什么(除了名称)Docker不是虚拟机,它只是配置操作系统,使程序:a)受约束(cGroup);b) 隔离(名称空间+chroot+分层fs)。直接在主机操作系统内运行的容器。不同的主机有不同的CPU。Docker不会坐在CPU(或任何其他硬件)和容器之间。谢谢@MargaretBloom,这开始回答我的问题。“Docker不是VM”->也就是Docker 101,我认为我的问题水平应该暗示我已经知道了这一点。“Docker不会坐在CPU之间”->这是更好的信息。尽管如此:映像本身有什么东西需要移植到不同的操作系统/体系结构?我们讨论的是图像可能包含的编译程序,还是其他什么?这里的兼容性目标是什么:操作系统还是CPU?操作系统不应该抽象CPU吗(老实说,我不知道它应该是什么样子的)?@RafaelEyng当然是编译程序。为特定的CPU编译一个程序。这就是为什么Java和CIL(.NET)字节码是。。。字节码而不是机器码。Docker只支持Linux(它在Win和Mac上运行Linux VM),虽然Docker映像提供了一些功能,但容器看到的内核是主机内核。因此,这是另一个可能的不兼容源。操作系统没有