docker 镜像第一步
我们使用docker的时候,可以用这么两个场景,存在疑问。
第一个,宿主主机是x86_64 Linux,我们想要运行一个docker 容器,容器里运行arm64环境。
第二个,宿主主机是x86_64 Linux,我们想要运行一个docker 容器,容器里运行同样的x86_64环境。
实际上以上两种都可以,但是所做的事情“”第一个“”有所限制。
拉取docker 镜像arm方法:
># 拉取arm64 Ubuntu>dockerpull--platformlinux/arm64 ubuntu:22.04># 运行ARM容器>dockerrun-it--platformlinux/arm64 ubuntu:22.04拉取docker 镜像x86_64方法:
># 拉取x86_64 Ubuntu>dockerpull--platformlinux/x86_64 ubuntu:22.04># 运行x86_64容器>dockerrun-it--platformlinux/x86_64 ubuntu:22.04想要宿主x86运行arm镜像,其一最简单方法是:
x86_64 宿主机,直接跑 ARM64/aarch64 容器,不需要完整虚拟机,靠 Docker 内置 qemu 模拟:
># 安装跨架构模拟器>dockerrun--privileged--rmtonistiigi/binfmt--installall执行后宿主机内核注册 qemu-aarch64-static 模拟器,此时:
x86_64 机器可以直接 pull、运行 arm64/v8 标签的镜像
容器内部完全是 ARM 系统环境,程序、库、编译链全部 ARM 架构。
我们可以进入容器后使用uname -a 查看验证。
内核注册是临时的,服务器重启后需要重新执行这条命令;
如需开机自启,写入 systemd 服务或开机脚本。
dockerrun 启动临时容器执行 binfmt 配置工具。--privileged必须加,授予最高系统权限,用于修改内核 /proc/sys/fs/binfmt_misc 二进制解析规则,普通权限无法注册模拟器。--rm执行完成后自动销毁该临时容器,不残留后台进程。 tonistiigi/binfmt 官方维护的轻量镜像,内置全套静态编译 qemu-*-static 模拟器(qemu-aarch64、qemu-arm 等)。--installall 注册全部支持架构的模拟器:arm64、armv7、riscv64、ppc64le、s390x、386 等; 只想装 ARM 可简写:--install arm64,arm。优缺点
✅ 部署简单,Docker 原生支持,不用搭建虚拟机
✅ 占用资源远低于完整 VM
❌ 纯 CPU 模拟,ARM 程序性能损耗大(编译、密集计算会很慢)
❌ 不支持 ARM 硬件(GPU、串口外设直通),只能纯软件系统
x86 上运行arm docekr容器,适合使用的场景是,仅需要 ARM 编译、运行 ARM 程序、测试 ARM 服务(MQTT/ROS2 等),不太适合做大型需要gpu等硬件基础的事情。
不能直通真实 ARM 硬件,只能虚拟环境;
模拟环境下,带硬件加速的程序(GPU、AI 推理)会大幅卡顿;
部分底层内核模块、嵌入式驱动无法在 qemu 模拟环境加载;
运行容器后台sudodockerrun-it-d--namehumble_1 ubuntu:22.04 进入容器内部sudodockerexec-ithumble_1 /bin/bash 强制删除多个容器sudodockerrm-fhumble_1 humble_2 humble_3