测试环境
Docker version 27.3.1, build ce12230 |
docker 运行与本机不同架构的镜像
几个一样效果的工具
本质都一样
- 在 docker 中使用 tonistiigi/binfmt 来注册 binfmt,官方推荐是这个
- 在 docker 中使用 multiarch/qemu-user-static 来注册 binfmt
- 直接 apt 安装
qemu-user-static
会自动注册好 binfmt,我用这个,后文还有其他玩法
使用方式
- 直接使用相关镜像平台镜像即可,具体支持,可以看
ls /proc/sys/fs/binfmt_misc/qemu*
或者 tonistiigi/binfmt 相关说明docker run --platform linux/arm64 --rm -t arm64v8/ubuntu uname -m
docker run --rm -t arm32v6/ubuntu uname -m
docker run --platform linux/arm/v7 --rm -t arm32v7/ubuntu uname -m
使用注意
- 针对 arm64 目标镜像,–platform linux/arm64 是必须的,看样子好像是 ubuntu 构建应该是 multi-platform images 方式如下图,通过 manifest 来自动识别目标镜像的平台,所以会报错。
- 所以保守方案,只要有
qemu
了,不管三七二十一都加上--platform
参数如果本地没有镜像则会报错
docker run --rm -t arm64v8/ubuntu uname -m
Unable to find image 'arm64v8/ubuntu:latest' locally
latest: Pulling from arm64v8/ubuntu
latest: Pulling from arm64v8/ubuntu
docker: no matching manifest for linux/amd64 in the manifest list entries.
See 'docker run --help'.
如果本地有目标架构镜像,则警告
docker run --rm -t arm64v8/ubuntu uname -m
WARNING: The requested image's platform (linux/arm64/v8) does not match the detected host platform (linux/amd64/v3) and no specific platform was requested
aarch64
chroot 玩法
- 搜资料时发现个有趣玩法记录下,参考
- 使用 chroot 结合 qemu-user-static 来实现,在 x86 平台运行 arm rootfs
- 更详细的 chroot 挂载可以参考之前写的文章
sudo apt install qemu-user-static -y
sudo mount -o loop rootfs.ext4 ./rootfs
或
tar -xjvf rootfs.tar.bz2 -C ./rootfs/
cp /usr/bin/qemu-arm-static ./rootfs/usr/bin
sudo chroot ./rootfs/ /bin/sh
参考链接
- 利用 qemu-user-static 实现 arm64 平台 docker 镜像的运行和构建
- 在 ubuntu@x86 用 chroot 到 ARM 平台的 rootfs
- https://github.com/tonistiigi/binfmt
- https://github.com/multiarch/qemu-user-static
- 官方推荐方式之一 tonistiigi/binfmt
- https://docs.docker.com/build/building/multi-platform/#difference-between-single-platform-and-multi-platform-images