如何确定Docker容器(在M1MacBook上)何时通过qemu运行?

已经提到,当在 M1 Mac 上使用 x86_64 Docker 镜像时,当没有可用的 ARM64 镜像时,该容器将在qemu仿真下启动以实现兼容性。(以性能为代价。)

很多时候,当我运行一组容器(以及针对该批次的集成测试)时,我会看到qemu-system-aarch64一些核心。

我的问题:对于给定的运行容器列表(即docker ps),我如何确定哪些是本机运行的,哪些是被模拟的?

回答

对于在amd64CPU 上运行的 Docker 也是如此,当为 构建映像时arm64,整个机制在此 SO 中进行了解释

仿真的机制是使用 中的信息elf来识别构建进程的架构,如果二进制的架构与 CPU 的架构不同,则启动qemu仿真。虽然架构的识别更多地与过程相关,但仍然有关于 docker 镜像的目标架构的信息。目标架构由映像上的“架构”标志确定,该标志是在构建映像时设置的。将运行映像的任何容器都将与此标志相关联(通过映像)。

应该注意的是,映像上的“架构”标志不会阻止映像内的单个进程,该进程是为与要运行的标记的架构不同的架构编译的。这样做的原因是bitfmt(这是位于 linux 内核内部的底层机制)将始终尝试从magic数字识别体系结构,如果识别出数字,elf将启动仿真magic

要列出容器的架构,您可以使用以下“快速”查询:

for i in `docker ps --format "{{.Image}}"` ; do docker image inspect $i --format "$i -> {{.Architecture}} : {{.Os}}" ;done

该命令将打印镜像的容器名称、架构和操作系统。

为避免多次输入此命令,您可以.bashrc按如下方式添加别名:

alias docker-arch-ps='for i in `docker ps --format "{{.Image}}"` ; do docker image inspect $i --format "$i -> {{.Architecture}} : {{.Os}}" ;done';

在此之后,您可以使用 simpledocker-arch-ps来获取容器及其架构的列表。


以上是如何确定Docker容器(在M1MacBook上)何时通过qemu运行?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>