微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何确定 Docker 容器在 M1 MacBook 上何时通过 qemu 运行?

如何解决如何确定 Docker 容器在 M1 MacBook 上何时通过 qemu 运行?

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

当我运行一系列容器(并针对该批次进行集成测试)时,我经常会看到 qemu-system-aarch64 挂几个核心。

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

解决方法

对于在 amd64 CPU 上运行的 Docker 也是如此,当为 arm64 构建映像时,整个机制为 explained in this SO

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

应该注意,镜像上的“架构”标志不会阻止镜像内的单个进程,该进程是为与标记的架构不同的架构编译的以运行。这样做的原因是 qemu(这是位于 linux 内核内部的底层机制)将始终尝试从 bitfmtmagic 数字识别架构,并将启动如果 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'; 来获取容器及其架构的列表。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。