如果希望 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
可以查看当前构建器及其驱动。
带 * 的为当前构建器,名称为 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 build
是 docker buildx build
的别名,固定使用 default 构建器(即使已经设置了其它的构建器为默认构建器)。如果 docker build 加上 --builder 参数指定构建器,则效果和 buildx 一样。