Docker 构建多平台 Image 镜像

2025-05-20 12:28

如果希望 Docker Image 可以在不同平台的机器(如 linux/amd64, linux/arm64)上运行,需要创建多平台镜像。多平台镜像可以使用同样的名称,但会根据运行环境自动选择不同平台的镜像。

有两种方法来构建多平台镜像:

  • "classic" image store 经典镜像仓库切换为 containerd image store

  • 使用 docker-container 构建器驱动,创建自定义构建器

Docker 多架构构建 官方文档:https://docs.docker.com/build/building/multi-platform/

多平台仿真器

Docker Desktop 默认安装了多平台仿真器,如果使用 Docker Engine 则需要另外安装 QEMU 多平台仿真器:

docker run --privileged --rm tonistiigi/binfmt --install all

创建成功后显示:

installing: arm OK
installing: riscv64 OK
installing: mips64le OK
installing: mips64 OK
installing: loong64 OK
installing: arm64 OK
installing: s390x OK
installing: ppc64le OK
{
  "supported": [
    "linux/amd64",
    "linux/amd64/v2",
    "linux/amd64/v3",
    "linux/arm64",
    "linux/riscv64",
    "linux/ppc64le",
    "linux/s390x",
    "linux/386",
    "linux/mips64le",
    "linux/mips64",
    "linux/loong64",
    "linux/arm/v7",
    "linux/arm/v6"
  ],
  "emulators": [
    "python3.12",
    "qemu-aarch64",
    "qemu-arm",
    "qemu-loongarch64",
    "qemu-mips64",
    "qemu-mips64el",
    "qemu-ppc64le",
    "qemu-riscv64",
    "qemu-s390x"
  ]
}

也可执行 ls /proc/sys/fs/binfmt_misc/ 查看是否安装成功:

ls /proc/sys/fs/binfmt_misc/
python3.12    qemu-arm          qemu-mips64    qemu-ppc64le  qemu-s390x  status
qemu-aarch64  qemu-loongarch64  qemu-mips64el  qemu-riscv64  register

启用 containerd image store

Docker默认的 classic 经典镜像仓库不支持多架构镜像,如果需要在本地支持多架构镜像,需要切换到 containerd image store

在文件 /etc/docker/daemon.json(不存在则新建)中增加如下内容:

{
  "features": {
    "containerd-snapshotter": true
  }
}

重启 Docker:

sudo systemctl restart docker

运行 docker info 查看是否启用成功:

docker info -f '{{ .DriverStatus }}'
[[driver-type io.containerd.snapshotter.v1]]

构建器驱动

构建 Docker Image 需要构建器,构建器有多种不同驱动:docker, docker-container, kubernetes, remote

Docker 默认构建器名为 default,驱动为 docker。这个构建器默认启动,可直接使用,最为方便。docker build 命令使用的就是这个构建器。但默认构建器不支持多架构构建。

使用 docker buildx ls 可以查看当前构建器及其驱动。

image.png

带 * 的为当前构建器,名称为 default,驱动为 docker,支持的架构为 linux/amd64

使用 docker-container 驱动的构建器默认不会将生成的镜像自动保存到本地镜像仓库,且Docker默认的 classic 经典镜像仓库不支持多架构镜像。如不切换到 containerd image store,可以直接使用 docker build --push,在镜像构建完成后,直接推送到远程镜像仓库。

Docker 构建器驱动 官方文档:https://docs.docker.com/build/builders/drivers/

自定义构建器

多架构构建需要使用多平台仿真器,默认驱动为 docker 的构建器不可使用多平台仿真器。

因此,需要安装多平台仿真器,并创建驱动为 docker-container(多平台仿真器)的构建器。使用自定义构建器,需要使用 buildx 命令。

创建构建器:

docker buildx create \
  --name container-builder \
  --driver docker-container \
  --bootstrap --use

如果需要使用代理,需加上代理参数,否则在构建时,会出现无法拉取镜像的问题:

docker buildx create \
  --driver-opt env.HTTP_PROXY=http://192.168.88.1:10809 \
  --driver-opt env.HTTPS_PROXY=http://192.168.88.1:10809 \
  --driver-opt "env.NO_PROXY=127.0.0.1,172.17.0.1,::1,localhost,.aliyuncs.com" \
  --name container-builder \
  --driver docker-container \
  --bootstrap --use

使用 docker buildx ls 命令查看,container-builder 是默认的构建器。

$ docker buildx ls
NAME/NODE                DRIVER/ENDPOINT                   STATUS    BUILDKIT   PLATFORMS
container-builder*       docker-container                                       
 \_ container-builder0    \_ unix:///var/run/docker.sock   running   v0.21.1    linux/amd64 (+3), linux/arm64, linux/arm (+2), linux/ppc64le, (6 more)
default                  docker                                                 
 \_ default               \_ default                       running   v0.21.0    linux/amd64 (+3), linux/arm64, linux/arm (+2), linux/ppc64le, (6 more)

如构建器创建错误,可删除:

docker buildx rm container-builder

常用平台

根据常用 JDK 镜像确定需要支持的平台。结论是,支持 linux/amd64, linux/arm64 即可。

  • openanolis/openjdk:阿里云 openjdk。支持:linux/amd64, linux/arm64

  • bellsoft/liberica-openjre-debian:SpringBoot 3 建议的 JDK。支持 linux/amd64, linux/arm64/v8

  • eclipse-temurin:SpringBoot 2 建议的 JDK。支持 linux/amd64, linux/arm64/v8, linux/arm/v7, linux/ppc64le, linux/riscv64, linux/s390x

执行构建

使用参数 --platform 指定需要支持的平台。

如使用自定义构建器,执行 docker buildx build 命令:

docker buildx build --platform linux/amd64,linux/arm64 -t ujcms/multi-platform .

如开启 containerd image store,使用 default 默认构建器即可,因此可以直接使用 docker build 命令:

docker build --platform linux/amd64,linux/arm64 -t ujcms/multi-platform .

docker builddocker buildx build 的别名,固定使用 default 构建器(即使已经设置了其它的构建器为默认构建器)。如果 docker build 加上 --builder 参数指定构建器,则效果和 buildx 一样。

上一篇: Git 设置代理
下一篇: 没有了
0791-85271700
QQ咨询:1779755751
QQ交流群:626599871
微信咨询
微信扫码咨询
微信交流群
微信交流群
Powered by UJCMS © 2010-2025 All Rights Reserved
QQ咨询
电话
微信
微信扫码咨询