mentioned 当在 M1 Mac 上使用 x86_64 Docker 镜像时,当没有可用的 ARM64 镜像时,该容器将在 qemu
仿真下启动以实现兼容性。 (以性能为代价。)
当我运行一系列容器(并针对该批次进行集成测试)时,我经常会看到 qemu-system-aarch64
挂几个核心。
我的问题:对于给定的运行容器列表(即 docker ps
),我如何确定哪些是本机运行的,哪些是被模拟的?
答案 0 :(得分:5)
对于在 amd64
CPU 上运行的 Docker 也是如此,当为 arm64
构建映像时,整个机制为 explained in this SO
仿真的机制是使用elf
中的信息来识别进程构建的架构,如果二进制的架构与CPU的架构不同,则启动{{1} }} 仿真。虽然架构的识别更多地与过程相关,但仍然有关于 docker 镜像的目标架构的信息。目标架构由映像上的“架构”标志确定,该标志是在构建映像时设置的。将运行映像的任何容器都将(通过映像)与此标志相关联。
应该注意,镜像上的“架构”标志不会阻止镜像内的单个进程,该进程是为与标记的架构不同的架构编译的以运行。这样做的原因是 qemu
(这是位于 linux 内核内部的底层机制)将始终尝试从 bitfmt
的 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';
来获取容器及其架构的列表。