简短版
我想知道为什么Docker镜像需要针对多个架构创建,这个问题的技术原因是什么?此外,是否应该为每个CPU架构或操作系统创建一个镜像也不是很清楚。难道操作系统不能抽象出架构吗?
详细版
我可以理解为什么Docker引擎必须被移植到多个架构。它是一种将与操作系统交互、进行系统调用的软件,最终只是以一系列指令的形式表示特定架构上的指令集。因此,就像Microsoft Word必须移植一样,Docker引擎必须移植到多个操作系统/架构。
同样的情况也发生在JVM或VirtualBox中。
但是,与Docker不同的是,为Windows编写的JVM软件可以在Linux上运行。JVM会抽象底层操作系统/架构的差异,并在两个平台上运行相同的代码。
为什么Docker镜像不是这种情况呢?为什么Docker引擎不能只抽象出差异,提供一个通用接口,使得镜像本身不需要与特定的操作系统/架构兼容?
这是一个决策(比如"让我们为每个架构创建不同的镜像,因为X原因更好"),还是Docker工作方式的结果(比如"我们需要这样做,因为Docker需要Y")?
注意事项
- 我不是在抱怨或批评。这并不是一篇发泄文章,我只是在寻找有关不同架构需要不同镜像的技术解释。
- 我不是要求如何创建多架构镜像。
- 我不是要求诸如“多架构镜像是为了在各种平台上运行镜像”之类的答案,这回答了“为什么要这样做?”而不是“为什么需要这样做?”(这是我的问题)。
此外,当您查看镜像时,通常会在其摘要中包含os/arch
,如下所示:
该镜像的目标到底是什么?操作系统、架构还是两者都是?操作系统不能抽象出底层架构吗?
编辑:我开始认为,每个架构需要不同的镜像是因为镜像本身包含应用程序。比如,它将包含Go编译器。Go编译器本身是必须已经编译为不同架构的二进制文件。x86-64
的镜像将包含已编译为x86-64
的Go编译器,等等。这样正确吗?如果这样正确,这是唯一的原因吗?