我碰巧发现,我的macos(x86)可以为arm映像arm64v8/阿尔卑斯运行一个码头容器,但有以下警告:
docker run -it arm64v8/alpine uname -a
WARNING: The requested image's platform (linux/arm64) does not match the detected host platform (linux/amd64) and no specific platform was requested
Linux d5509c57dd24 4.19.121-linuxkit #1 SMP Tue Dec 1 17:50:32 UTC 2020 aarch64 Linux而且我很确定这个图像不是一个多拱图像(docker manifest inspect --verbose arm64v8/alpine)。为什么x86可以运行arm容器?
发布于 2021-03-02 07:38:41
您是正确的,图像不是多架构,但是,码头可以运行它。这背后的原因是一个名为binfmt_misc的内核子系统,它允许将二进制文件的magic编号设置为执行它们的特定操作。你可以在这个漂亮的维基百科帖子上读到更多关于它的内容。
Docker正在为binfmt魔术做好准备,所以没有什么可做的了。它将启用开箱即用的安装,您所需要做的就是获取映像并运行。该机制的详细信息可以在此链接上的docker项目存储库中找到。
简单地解释一下,二进制映像有一个magic编号,它允许内核决定如何处理执行。当binfmt_misc截取它识别magic编号的文件时,它将调用与magic编号相关联的处理程序。
仅凭这一点还不足以运行容器。魔术的下一部分是QEMU,它是各种CPU体系结构的模拟器。内核(binfmt_misc)将为每个属于ARM64的二进制文件调用quemy,并将模仿ARM64v8。
这不仅限于docker,也不限于在macOS上运行docker的虚拟机。任何linux系统都可以配置为这样做。
您可以使用下面的方法来安装它,安装Ubuntu来运行仿真。
sudo apt-get install qemu binfmt-support qemu-user-static # Install the qemu packages
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes # This step will execute the registering scripts
docker run --rm -t arm64v8/ubuntu uname -m # Testing the emulation environment有关整个设置过程的更多详细信息可以在qemu-用户静态存储库中找到。
OP:如果您想知道这样做有什么用处,从我个人的经验来看,在将应用程序从X86移植到其他体系结构(主要是ARM64)时,我正在大量使用此功能。这允许我为不同的体系结构运行构建系统,而不需要在物理机器上运行构建。
https://stackoverflow.com/questions/66350893
复制相似问题