【问题标题】:Why macos(x86) can run docker arm container arm64v8/alpine?为什么 macos(x86) 可以运行 docker arm 容器 arm64v8/alpine?
【发布时间】:2021-05-26 18:32:42
【问题描述】:

我碰巧发现在我的 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 容器?

提前致谢

【问题讨论】:

  • 我可能会离开,但我相信这与 qemu 捆绑运行 arm images 的事实有关,this post 中也提到过。尽管这可能会被您的检查命令否定。这也用于在 Apple Silicon 上运行 amd64 图像。

标签: docker linux-kernel emulation qemu


【解决方案1】:

你是对的,图像不是多架构的,但是,docker可以运行它。这背后的原因是一个名为binfmt_misc 的内核子系统,它允许将二进制文件的magic 数字设置为执行它们的特定操作。你可以在这个漂亮的wikipedia post 中阅读更多关于它的信息。

Docker for Mac 即将到来,为binfmt 的魔力做好了准备,因此无需做任何事情来启用它。它将在安装时开箱即用,您需要做的就是获取图像并运行。该机制的详细信息可以在link 上的 docker-for-mac 项目的存储库中找到。

简单来说,二进制映像有magic 编号,允许内核决定如何处理执行。当binfmt_misc 截获一个他识别出magic 号码的文件时,他将调用与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-user-static存储库中找到

OP:如果您想知道这有什么用处,根据我的个人经验,在将应用程序从 X86 移植到其他架构(主要是 ARM64)时,我会大量使用此功能。这使我可以在没有可以运行构建的物理机器的情况下为各种架构运行构建系统。

【讨论】:

  • 感谢您的评论。但我不记得我在我的 macos Big Sur 11.2.1 上安装了 qemu。我检查了 brew list 和 pkgutil --pkgs。还有其他方法可以确认我的机器上安装了 qemu 吗?
  • 在 macOS 上,您无需安装任何东西,docker 已为bitfmt 魔术提供了准备。这是Docker for Mac 本身的一部分。
猜你喜欢
  • 2021-06-11
  • 2016-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-20
  • 2018-04-09
相关资源
最近更新 更多