在x86服务器上构建arm架构容器镜像

随着技术架构的深刻变革,docker 镜像也迎来了关键的转型 —— 从 x86 向 arm 架构转变。

Linux系统上构建ARM镜像,可以通过使用Docker的buildx插件 来实现。以下是具体的操作步骤:

1.安装Docker Buildx

Docker 与 Buildx 之间没有一份官方发布的、严格一一对应的版本兼容性矩阵。不过,根据官方文档和发行说明,可以梳理出一个清晰的版本对应关系和使用建议。

核心版本要求:

  • 最低要求:使用 Buildx 要求 Docker Engine 19.03 或更高版本。这是能否使用 buildx 命令的门槛。

  • 默认集成:从 Docker Engine 23.0 和 Docker Desktop 4.19 开始,Buildx 已成为默认的构建客户端。这意味着直接运行 docker build 命令,背后调用的就是 Buildx

以下是根据公开信息整理的部分 Docker 版本所捆绑的 Buildx 版本:

Docker 版本 捆绑的 Buildx 版本 备注
Docker 20.10 v0.9.1, v0.10.0, v0.10.4 不同补丁版本会更新 Buildx
Docker 23.0+ 需单独安装 自此版本起,Buildx 成为默认构建客户端
Docker 28+ 需单独安装 推荐使用,以获得最完整的 Buildx 功能支持

安装buildx插件的示例命令:

wget https://github.com/docker/buildx/releases/download/v0.14.0/buildx-v0.14.0.linux-amd64
chmod a+x buildx-v0.14.0.linux-amd64
mkdir -p /usr/libexec/docker/cli-plugins
mv buildx-v0.14.0.linux-amd64 /usr/libexec/docker/cli-plugins/docker-buildx

如果遇到 client version ... is too old 或 is too new 之类的错误,通常意味着 Buildx 与 Docker 守护进程(Daemon)的 API 版本不匹配。此时,升级或降级 Buildx 版本(优先选择与 Docker 版本相近的发行版)通常可以解决问题

2.启用Docker实验性功能

通过修改Docker配置文件(通常位于/etc/docker/daemon.json)来启用实验功能。

{
  "experimental": true
}

重启Docker服务:

systemctl daemon-reload
systemctl restart docker

3.检查实验特性是否开启以及buildx是否安装成功

docker version --format '{{.Server.Experimental}}'
docker buildx version

4.创建buildx构建器

推荐使用docker-container驱动,它对多平台构建支持更好

docker buildx create --name image_buildx --driver docker-container --use
docker buildx ls

5.构建ARM镜像

使用buildx构建ARM镜像的命令:

docker buildx build --platform=linux/arm64 -t your-image-name:tag --push .

这个命令会构建一个指定平台(这里是ARM64)的Docker镜像,并将其推送到远程仓库。

  • 加速构建(交叉编译):QEMU模拟会降低构建速度,尤其是在编译大型项目时。如果使用GoRust等语言,可以在Dockerfile中直接设置目标操作系统和架构的环境变量(如GOOS=linuxGOARCH=arm64)进行交叉编译,速度会快很多

  • 显式指定基础镜像:如果Dockerfile中的基础镜像没有明确支持ARM,可以在FROM指令中指定平台
    FROM --platform=linux/arm64 ubuntu:22.04

6.实操范例演示&验证

拉取特定于ARM64平台的Docker镜像,使用以下命令格式:

docker pull --platform=linux/arm64 <镜像仓库地址>/<镜像名>:<标签>

检查已拉取的Docker镜像的详细信息,使用以下命令格式:

docker inspect <镜像仓库地址>/<镜像名>:<标签>

将Docker镜像保存为tar格式的文件,使用以下命令格式:

docker save --platform linux/arm64 -o <本地文件>.tar <镜像仓库地址>/<镜像名>:<标签>

7.安装QEMU与binfmt-support:这是实现跨平台模拟的关键。

yum  -y  install  qemu-user-static binfmt-support

8.在X86架构机器上运行ARM镜像

确保Docker实验特性已经开启,运行一个特权容器,将QEMU注册到内核的binfmt_misc模块,使内核能自动调用QEMU来运行ARM程序,运行以下命令来启用QEMU仿真:

docker run --rm --privileged multiarch/qemu-user-static --reset -p yes

仿真开启成功后,使用以下命令运行ARM镜像:

docker run -it --platform=linux/arm64 your-arm64-image

 

以上步骤提供了在Linux 系统上构建ARM镜像的详细指南,包括安装buildx、启用实验性功能、创建构建器、构建镜像以及在X86架构机器上运行ARM镜像的方法。