Docker 命令 之 Dockerfile 多平台构建
摘要
-
本文介绍 Docker 命令 中 Dockerfile 多平台构建的使用方法
什么是Dockerfile 多平台构建?
-
Dockerfile 多平台构建,可以构建多个平台镜像,比如 arm64、amd64、arm、386 等。
-
在没有安装
docker-buildx-plugin的情况下,docker build命令是不支持使用--platform构建出跨平台镜像的,其仅能构建与本机架构平台相同的镜像。 -
要真正实现跨平台构建(multi-platform build),比如在 amd64 上构建 arm64 的镜像,需要使用 BuildKit 和 buildx 插件。
-
docker-buildx-plugin是基于 BuildKit 构建的,但它本身是 Buildx 的一个实现形式,它扩展了docker build的能力,支持多平台构建(如同时构建 Linux/amd64 和 Linux/arm64等)。
安装 docker-buildx-plugin
-
随docker服务一起安装
1 | sudo dnf -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin |
-
单独安装
1 | sudo dnf -y install docker-buildx-plugin |
-
查看版本
1 | docker buildx version |
docker buildx 基本命令
-
以下命令在后面的示例中都有使用
| 命令 | 说明 |
|---|---|
docker buildx create |
创建一个新的构建器实例 |
docker buildx use |
设置当前使用的构建器 |
docker buildx inspect |
查看构建器状态和支持的平台 |
docker buildx build |
构建镜像(增强版),等同于 docker build |
docker buildx ls |
列出所有构建器 |
docker buildx rm |
删除构建器 |
docker buildx du |
查看构建器使用的磁盘空间 |
docker buildx prune |
删除构建过程中产生的缓存 |
docker buildx version |
查看 Docker Buildx 的版本信息 |
要让Docker支持多平台构建,需要满足以下几个条件:
-
Linux内核开启多处理器架构支持
-
构建时使用基于
docker-container驱动的Buildx实例 -
使用
docker buildx build命令构建镜像,构建命令必须指定–platform参数
Linux内核开启多处理器架构支持
1 | # 列出所有构建器,默认情况下只有一个名称为"default"的构建器 |
构建时使用基于docker-container驱动的Buildx实例
-
Docker 的默认构建驱动是 docker,它是运行在本地 Docker 守护进程上的,不能进行真正的多平台构建(仅能构建当前平台)。
-
多平台构建需要使用 BuildKit 的 container 驱动,它以容器的形式运行构建器,支持虚拟化平台并行构建。
1 | # 查看当前默认的构建器default |
-
创建基于
docker-container驱动的Buildx实例
1 | # 创建并切换到名为mybuilder的构建器实例 |
-
buildx_buildkit_xxx这个容器就是一个 BuildKit 守护进程容器,它是执行 buildx 构建任务的实际工作引擎。其对应的镜像为moby/buildkit:buildx-stable-1,容器会在执行docker buildx build或docker buildx inspect --bootstrap时启动
| 功能 | 说明 |
|---|---|
| 👷 执行构建任务 | 真正执行 buildx build 指令里的构建过程,比如多阶段构建、缓存处理、跨平台编译等 |
| 📦 拉取镜像 | 拉取 Dockerfile 中的基础镜像 |
| 📤 上传/导出镜像 | 支持导出为 docker image, tar, 推送到远程 registry |
| 🪣 管理缓存 | 管理构建缓存(中间镜像、层等)以加速后续构建 |
| 🌍 支持多平台 | 通过 QEMU 或交叉编译器支持跨平台(如构建 arm64 镜像) |
-
在国内环境使用时,如果不能科学上网,当我们在构建镜像时会提示无法拉取基础镜像,即便我们已经在
/etc/docker/daemon.json中配置了国内的镜像源也不行,这是因为docker buildx使用的是 BuildKit,它的行为不同于传统的docker build
| 特性 | docker build(传统) |
docker buildx(BuildKit) |
|---|---|---|
| 是否使用本地镜像缓存 | ✅ 是 | ⚠️ 不是 |
| 是否需要联网拉取元数据(即使镜像已存在) | 否 | 是 |
| 构建网络隔离 | 不隔离 | 隔离构建,无法直接访问宿主镜像缓存 |
-
解决方法为构建器配置镜像源
1 | # 创建 BuildKit 配置文件 buildkitd.toml |
使用docker buildx build命令构建镜像,构建命令必须指定--platform参数
示例一:单阶段构建
-
我们依旧以一个springboot项目为例,其Dockerfile如下:
1 | # 使用轻量级 Alpine 版本的 OpenJDK 17 官方镜像,适合部署 Spring Boot 应用 |
-
开始构建镜像,
docker buildx build == docker build,构建多平台架构时需要使用--platform指定构建平台
1 | # --platform inux/arm64 :构建arm64镜像 |
-
如何查看镜像是否支持多平台呢?可以在docker hub上查看,也可以使用如下命令
1 | # 查询镜像支持的平台,不过国内依旧是不支持 |
-
替换支持多架构的镜像后重新构建镜像就会成功
1 | docker buildx build --platform linux/arm64 -t "app.arm64" --load . |
-
--load和--output都不支持一个镜像多种架构,要构建像openjdk:17-slim这种支持多架构的镜像可以使用--push,一步就推送到远程仓库
1 | # 构建多架构镜像,--push 可以一步做到:多平台构建的镜像不能只保存到本地,必须推送到远程 registry 才能合并架构。 |

-
镜像拉取
1 | # 拉取指定架构镜像,不指定 --platform 参数,默认拉取当前架构的镜像 |
示例二:多阶段构建
-
要求每个阶段中的基础镜像都要支持多架构
1 | # 第一阶段:获取代码 |
-
构建镜像
1 | # 构建多平台镜像并发布到dockerhub |
如何将构建好的多个单平台镜像发布为一个多平台镜像
-
如果你已经分别构建好单平台镜像,也可以用
docker buildx imagetools create来合并 -
以上面创建的两个单平台镜像为例
1 | # 列出镜像 |

-
如果不需要单平台镜像,可以在dockerhub上删除即可。
移除 BuildKit(Buildx)构建过程中产生的缓存数据
-
BuildKit(Buildx)构建过程会产生缓存数据,包括未使用的中间镜像、构建层等。对于频繁使用 Docker 构建的开发者来说,这些缓存会逐渐占用大量磁盘空间。
-
可以通过该命令查看缓存占用磁盘空间的大小
1 | docker buildx du |
-
docker buildx prune是一个用于 清理 Docker Buildx 构建缓存 的命令,常用于释放磁盘空间。 -
命令语法
1 | docker buildx prune [OPTIONS] |
| OPTIONS | 作用 |
|---|---|
-a, --all |
包括内部/前端镜像。默认只删除无用缓存,加上该参数会清除更多缓存内容,包括可能仍可用的内容(更彻底)。 |
--builder string |
指定使用哪个 builder 实例(可通过 docker buildx ls 查看当前有哪些 builder)。 |
--filter filter |
设定清理条件,例如:until=24h 表示只删除 24 小时前的缓存。 |
-f, --force |
不提示确认,直接执行清理操作。常用于脚本中。 |
--keep-storage bytes |
保留指定大小的缓存空间,其余删除(如:--keep-storage 5GB)。 |
--verbose |
输出更详细的清理信息。 |
-
示例
1 | # 删除所有未使用的缓存,并跳过确认提示 |