docker buildx-CLI 插件,基于 **BuildKit** 构建引擎


一、什么是 docker buildx

docker buildx 是 Docker 官方的 CLI 插件,基于 BuildKit 构建引擎,扩展了 docker build 的能力,核心是多平台镜像构建、高效缓存、并行构建、自定义构建器,解决传统 docker build 不支持跨架构、缓存弱、功能单一的问题。 - 核心定位:Buildx = BuildKit 的前端 CLI,管理构建器(builder)、执行跨平台构建、输出多种格式(镜像、本地文件、tar)。 - 安装:Docker Desktop 已默认集成;Linux 需安装 docker-buildx-plugin 包。

二、核心概念:构建器(Builder)

Buildx 以构建器实例运行,每个实例对应一个 BuildKit 后端,支持不同驱动: 1. docker(默认):使用本地 Docker 引擎,不支持多平台并行构建 2. docker-container(推荐):在独立容器中运行 BuildKit,支持多平台、完整缓存、并行构建 3. kubernetes:在 K8s 集群中运行 BuildKit,适合大规模 CI/CD 4. remote:连接远程 BuildKit 实例

常用构建器命令

# 1. 创建并启用支持多平台的构建器(docker-container驱动)
docker buildx create --name mybuilder --driver docker-container --use

# 2. 启动/初始化构建器(拉取BuildKit镜像、配置QEMU)
docker buildx inspect mybuilder --bootstrap

# 3. 查看当前构建器
docker buildx ls

# 4. 切换构建器
docker buildx use mybuilder

# 5. 删除构建器
docker buildx rm mybuilder

三、核心命令:docker buildx build

基础用法(同 docker build,兼容所有参数)

# 单平台构建(默认当前架构)
docker buildx build -t myimage:v1 .

# 多平台核心命令(最常用):同时构建 amd64/arm64,直接推送到仓库
docker buildx build \
  --platform linux/amd64,linux/arm64,linux/arm/v7 \
  -t username/myapp:latest \
  --push \
  .
  • --platform:指定目标平台,格式 os/arch[/variant],如 linux/amd64linux/arm64linux/arm/v7
  • --push:直接推送到镜像仓库(Docker Hub、私有 registry);默认不加载到本地 Docker 引擎(多平台镜像无法直接加载到本地默认存储)
  • --load:仅单平台时可用,把镜像加载到本地 Docker(docker images 可见)
  • --output/-o:导出为本地文件/目录(不生成镜像):--output type=local,dest=./output--output type=tar,dest=image.tar

多平台构建的三种方式(Buildx 支持)

  1. QEMU 仿真(最简单,无需改 Dockerfile)
  2. 依赖内核 QEMU 支持,Docker Desktop 已默认开启;Linux 需安装 qemu-user-static
  3. 适合简单镜像、无需交叉编译的场景
  4. 原生多节点构建(最快,无仿真开销)
  5. 把不同架构的机器加入同一个 builder,分别原生构建
  6. Dockerfile 交叉编译(最灵活,性能最好)
  7. 在 Dockerfile 中用 ARG TARGETOS/TARGETARCH 做跨平台编译,避免仿真

四、常用参数与进阶用法

1. 缓存优化(BuildKit 核心优势)

# 启用缓存,推送到 registry 共享缓存(CI/CD 必备)
docker buildx build \
  --platform linux/amd64,linux/arm64 \
  -t myimage:v1 \
  --cache-from type=registry,ref=myimage:cache \
  --cache-to type=registry,ref=myimage:cache,mode=max \
  --push .
  • --cache-from:从哪里读取缓存
  • --cache-to:把缓存写到哪里(mode=max 保留所有层缓存)

2. 构建参数与多阶段

# 传递构建参数、指定 Dockerfile、多阶段目标
docker buildx build \
  --platform linux/amd64,linux/arm64 \
  -f Dockerfile.prod \
  --build-arg VERSION=1.0.0 \
  --target production \
  -t myapp:prod \
  --push .

3. 查看构建详情

# 查看构建器状态、支持平台
docker buildx inspect --bootstrap

# 查看构建历史
docker buildx du

五、常见问题与注意事项

  1. 多平台镜像无法 docker load 到本地:默认 Docker 存储不支持多平台 manifest;要么用 --push 推仓库,要么启用 containerd 镜像存储(Docker Desktop 设置 → 通用 → 使用 containerd 存储镜像)
  2. QEMU 仿真慢:复杂编译(如 Go、Rust)建议用交叉编译,或原生节点构建
  3. 构建器卡住/异常:删除重建:docker buildx rm mybuilder && docker buildx create --name mybuilder --use

六、完整实战示例(一键多平台构建+推送)

# 1. 创建并启用构建器
docker buildx create --name multi-builder --driver docker-container --use
docker buildx inspect --bootstrap

# 2. 构建并推送 amd64/arm64 镜像
docker buildx build \
  --platform linux/amd64,linux/arm64 \
  -t yourname/hello:v1 \
  --cache-from type=registry,ref=yourname/hello:cache \
  --cache-to type=registry,ref=yourname/hello:cache,mode=max \
  --push \
  .

# 3. 验证(拉取并运行对应架构)
docker run --rm yourname/hello:v1