Skip to main content

背景

随着ARM架构服务器的普及(如AWS Graviton、华为鲲鹏、苹果Apple Silicon等),越来越多的业务需要同时在amd64arm64平台上运行容器。传统方式需要在对应架构的机器上分别构建镜像,再通过manifest手动合并,操作繁琐且容易出错。

Docker buildx是官方提供的跨平台构建插件,基于QEMU用户态模拟和BuildKit后端,可以在单台机器上一次性构建出多架构的镜像,并将其以manifest list的形式推送到镜像仓库。拉取镜像时,Docker会自动根据当前宿主机架构选取匹配的镜像层,无需额外配置。

安装docker-buildx插件

Ubuntu系统上,docker-buildx作为独立软件包提供,执行以下命令安装:

apt install -y docker-buildx

安装完成后,可通过以下命令验证插件是否可用:

docker buildx version

创建构建器

默认的docker驱动不支持多平台构建,直接执行跨平台构建命令会出现如下报错:

ERROR: failed to build: Multi-platform build is not supported for the docker driver.
Switch to a different driver, or turn on the containerd image store, and try again.
Learn more at https://docs.docker.com/go/build-multi-platform/

需要创建一个使用docker-container驱动的构建器,该驱动会以容器的形式运行BuildKit,支持多平台构建:

docker buildx create --name mybuilder --driver docker-container --use

参数说明如下:

参数说明
--name mybuilder构建器的名称,可自定义
--driver docker-container使用docker-container驱动,以容器方式运行BuildKit
--use创建后立即将其设为当前活跃构建器

启动并检查构建器

创建构建器后,需要使用inspect命令初始化并启动BuildKit容器,同时确认构建器支持的目标平台列表:

docker buildx inspect mybuilder --bootstrap

命令执行成功后,输出示例如下:

Name:          mybuilder
Driver: docker-container
Last Activity: 2026-05-06 ...

Nodes:
Name: mybuilder0
Endpoint: unix:///var/run/docker.sock
Status: running
BuildKit daemon flags: --allow-insecure-entitlement=network.host
Platforms: linux/amd64, linux/arm64, linux/arm/v7, ...

Platforms列表中包含linux/amd64linux/arm64,则说明构建器已就绪。

执行跨平台构建

构建器准备完成后,使用如下命令构建多架构镜像并直接推送到镜像仓库:

docker buildx build \
--platform linux/amd64,linux/arm64 \
-t loads/ubuntu:24.04-with-ca \
-f Dockerfile \
. \
--push

参数说明如下:

参数说明
--platform linux/amd64,linux/arm64指定目标平台,多个平台用逗号分隔
-t loads/ubuntu:24.04-with-ca镜像名称及标签
-f Dockerfile指定Dockerfile路径
.构建上下文目录
--push构建完成后自动推送到镜像仓库

注意:多平台构建结果无法保存到本地docker images,必须配合--push推送到远端仓库,或使用--output type=oci导出为本地文件。

完整流程

常见问题

构建时提示无法拉取基础镜像

跨平台构建时,BuildKit容器需要访问外网以拉取基础镜像。若网络受限,可预先配置镜像加速代理,或使用--build-arg GOPROXY等方式指定代理。

构建器状态异常

若构建器异常,可删除后重新创建:

docker buildx rm mybuilder
docker buildx create --name mybuilder --driver docker-container --use

本地验证多架构镜像

镜像推送完成后,可通过以下命令查看manifest确认多架构信息:

docker buildx imagetools inspect loads/ubuntu:24.04-with-ca