如何解决为什么 macos(x86) 可以运行 docker arm 容器 arm64v8/alpine?
我碰巧发现在我的 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
编号设置为执行的特定操作。您可以在这篇精彩的 wikipedia post 中阅读更多内容。
Mac 版 Docker 已经为 binfmt
魔法做好了准备,因此无需执行任何操作即可启用它。它将在安装时开箱即用,您需要做的就是获取图像并运行。该机制的详细信息可以在此 link 上的 docker-for-mac 项目存储库中找到。
简单来说,二进制图像具有 magic
编号,允许内核决定如何处理执行。当 binfmt_misc
截获他识别 magic
编号的文件时,他将调用与 magic
编号关联的处理程序。
仅此不足以运行容器。 魔法的下一部分是 QEMU
,它是各种 CPU 架构的模拟器。内核 (binfmt_misc
) 将为每个 ARM64 二进制文件调用查询并模拟 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)时大量使用此功能。这使我能够为各种架构运行构建系统,而无需我可以在其上运行构建的物理机器。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。