作者: | 来源:互联网 | 2023-09-15 10:47
我碰巧发现在我的 macos(x86) 上可以为 arm 图像 arm64v8/alpine 运行 docker 容器,但有警告,见下文
docker run -it arm64v8/alpine uname -a
警告:请求的映像平台 (linux/arm64) 与检测到的主机平台 (linux/amd64) 不匹配,并且未请求特定平台 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 容器?
提前致谢
回答
你是对的,图像不是多架构,但是,docker可以运行它。这背后的原因是一个被调用的内核子系统binfmt_misc
,它允许将magic
二进制文件的编号设置为执行的特定操作。你可以在这篇很好的维基百科帖子中阅读更多关于它的信息。
Mac 版 Docker 已经为binfmt
魔法做好了准备,因此无需执行任何操作即可启用它。它将在安装时开箱即用,您需要做的就是获取图像并运行。该机制的详细信息可以在此链接上的 docker-for-mac 项目的存储库中找到。
简单地解释一下,二进制图像具有magic
允许内核决定如何处理执行的编号。当binfmt_misc
截获一个他识别出magic
数字的文件时,他将调用与这些magic
数字相关联的处理程序。
仅此一项不足以运行容器。的下一部分魔术是QEMU
它是各种CPU架构模拟器。内核 ( binfmt_misc
) 将为每个 ARM64 二进制文件调用 quemy,并将模拟 ARM64v8。
这并不局限于docker
也不是运行在虚拟机docker
上macOS
。任何 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-user-static存储库中找到
OP:如果您想知道这有什么用处,根据我的个人经验,在将应用程序从 X86 移植到其他体系结构(主要是 ARM64)时,我会大量使用此功能。这使我可以为各种架构运行构建系统,而无需可以在其上运行构建的物理机器。