X86机器运行ARM64 Docker
multiarch/qemu-user-static 是使能 QEMU 执行不同的多架构容器,以下是 Docker 的示例。
XML/HTML代码
- # 查看硬件构架
- $ uname -m
- x86_64
- # 运行arm64v8版本的ubuntu系统,查看构架(错误提示)
- $ docker run --rm -t --platform arm64 arm64v8/ubuntu uname -m
- standard_init_linux.go:211: exec user process caused "exec format error"
- # 运行qemu多构架支持
- $ docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
- # 查看arm64v8版本的ubuntu系统,查看构架(正常显示aarch64)
- $ docker run --rm -t --platform arm64 arm64v8/ubuntu uname -m
- aarch64
它适用于许多架构和操作系统容器映像,以下为各个版本硬件构架演示。
XML/HTML代码
- $ docker run --rm -t --platform arm arm32v6/alpine uname -m
- armv7l
- $ docker run --rm -t --platform ppc64le ppc64le/debian uname -m
- ppc64le
- $ docker run --rm -t --platform s390x s390x/ubuntu uname -m
- s390x
- $ docker run --rm -t --platform arm64 arm64v8/fedora uname -m
- aarch64
- $ docker run --rm -t --platform arm arm32v7/centos uname -m
- armv7l
- $ docker run --rm -t --platform ppc64le ppc64le/busybox uname -m
- ppc64le
- $ docker run --rm -t --platform 386 i386/ubuntu uname -m
- x86_64
- #Podman有效
- $ sudo podman run --rm --privileged multiarch/qemu-user-static --reset -p yes
- $ podman run --rm -t arm64v8/fedora uname -m
- aarch64
常见硬件构架镜像地址:
简单创建一个arm64v8的Debian、Ubuntu、Centos、Alpine
XML/HTML代码
- docker run --name multiarch --privileged --restart=always multiarch/qemu-user-static --reset -p yes
XML/HTML代码
- #Debian
- docker run -tid --name debian --privileged=true --platform arm64 arm64v8/debian
- docker exec -it debian /bin/bash
- #Ubuntu
- docker run -tid --name ubuntu --privileged=true --platform arm64 arm64v8/ubuntu
- docker exec -it ubuntu /bin/bash
- #Centos
- docker run -tid --name centos --privileged=true --platform arm64 arm64v8/centos
- docker exec -it centos /bin/bash
- #Alpine
- docker run -tid --name alpine --privileged=true --platform arm64 arm64v8/alpine
- docker exec -it alpine /bin/sh
注意:新版本docker需要使用 --platform arm64 指定镜像平台,否则只能拉取默认平台版本。另以上操作在PVE平台可以直接使用,无需安装任何组件和操作,其他系统则需要复杂设置才能使用。
最新更新:
官方傻瓜命令(强烈推荐使用)
XML/HTML代码
- docker run --privileged --rm tonistiigi/binfmt --install all
系统要求:
Linux 内核版本 4.8 或更高版本
binfmt-support2.1.7 或更高版本
原理:QEMU 二进制文件必须静态编译并使用 fix_binary标志注册,使用 tonistiigi/binfmt 映像安装 QEMU 并通过单个命令在主机上注册可执行文件类型,将安装 QEMU 二进制文件并将其注册到 binfmt_misc,从而使 QEMU 能够执行非本地文件格式进行模拟。
手动设置方法(原理)
查看主机支持的CPU构架
XML/HTML代码
- mount | grep binfmt_misc
- ls /proc/sys/fs/binfmt_misc/
XML/HTML代码
- docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
XML/HTML代码
- ls /proc/sys/fs/binfmt_misc/
验证是否成功(新版docker必须指定平台,此命令不适用)
XML/HTML代码
- docker run --rm -t arm64v8/alpine uname -m
XML/HTML代码
- docker run --rm -t --platform arm64 arm64v8/alpine uname -m
特别提醒:以上方法均为物理机或者虚拟机测试通过,至于lxc、lxd之类容器化的环境是无法使用的。
如果系统是Alpine需要执行按照以下命令执行
Alpine安装常用组件
XML/HTML代码
- apk add htop nload curl wget tar ncdu git bash net-tools sudo
Docker一键安装命令
XML/HTML代码
- bash <(curl -sL https://iii80.com/sh/docker.sh)
Docker管理面板Portainer单独安装
XML/HTML代码
- docker run -d --restart=always --name="portainer" -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data 6053537/portainer-ce
- #163镜像安装
- docker run -d --restart=always --name="portainer" -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock hub-mirror.c.163.com/6053537/portainer-ce
- docker restart portainer
XML/HTML代码
- apk add qemu-x86_64 qemu-i386 qemu-openrc openrc
- rc-update add qemu-binfmt default
- rc-service qemu-binfmt start
- docker run --privileged --rm tonistiigi/binfmt --install all