目录
如何构建多平台镜像?
工作原理
准备构建环境
开启Linux内核对多处理器架构的支持 创建使用"docker-container"驱动的Buildx实例
调整Dockerfile
调整构建命令
在不同镜像仓库之间传输镜像
如何构建多平台镜像?
如果你还不了解什么是多平台构建,请先阅读一下Docker构建多平台镜像的文档:
https://docs.docker.com/build/building/multi-platform/
官方文档里给出了3种多平台镜像的构建方式,本文推荐使用第3种方式,即Dockerfile多平台构建的方式。采用这种方式的好处是不用针对每种平台准备一份Dockerfile,只需要调整构建镜像的参数就能同时支持多平台构建。
工作原理
要让Docker支持多平台构建,需要满足以下几个条件:
Linux内核开启多处理器架构支持
构建时使用基于"docker-container"驱动的Buildx实例
使用"docker buildx build"命令构建镜像
构建命令必须指定"–platform"参数
Dockerfile中,“FROM"指令必须设置”-platform=${TARGETPLATFORM}"
Docker构建多平台镜像实际上是借助BuildKit来实现的,并且需要创建一个基于"docker-container"驱动的Buildx实例。创建实例时,Docker会创建一个容器作为虚拟节点,用来执行构建,并存放构建后产生的镜像。
当同时指定了"amd64"和"arm64"平台构建镜像时,BuildKit会分别启动两个容器,一个容器构建"amd64"架构的镜像,另一个容器构建"arm64"架构的镜像。两个容器的构建过程相同,使用的Dockerfile内容也相同。BuildKit构建完两个镜像后,会创建一个Manifest List对象,然后把"amd64"和"arm64"的镜像记录到manifest中,接着用构建时的"-–tag"参数作为manifest的名称。如果把"–tag"指定的镜像名推送到Registry,BuildKit会将Manifest对象、两个架构的镜像都推到Registry。
需要注意,BuildKit创建的镜像和Manifest都仅存在于Buildx实例中,在宿主机上是看不到这些镜像的。
准备构建环境
构建多平台镜像最难处理的地方在于准备构建环境
开启Linux内核对多处理器架构的支持
Docker的官方文档已经给出具体方案,只需要执行以下命令即可。但前提是Linux内核版本必须>=4.8,如果不满足条件,升级内核的操作可自行谷歌
命令行
docker run --privileged --rm tonistiigi/binfmt --install all
执行完成后,可以执行以下命令进行检查
docker buildx ls
“平台”中出现"linux/arm64"字样即表示开启成功,输出内容如下:
NAME/NODE DRIVER/ENDPOINT STATUS BUILDKIT PLATFORMS
default docker
default default running v0.11.6 linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
创建使用"docker-container"驱动的Buildx实例
Docker的官方文档已给出具体方案,只需要执行以下命令即可。
命令行
docker buildx create --name mybuilder --driver docker-container --use
执行完成后,可以使用以下命令进行检查
docker buildx ls
输出内容如下
NAME/NODE DRIVER/ENDPOINT STATUS BUILDKIT PLATFORMS
mybuilder * docker-container
mybuilder0 unix:///var/run/docker.sock running v0.11.6 linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
default docker
default default running v0.11.6 linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
调整Dockerfile
Dockerfile只需要加上"–platform=${TARGETPLATFORM}"参数,示例:
Dockerfile
FROM --platform=${TARGETPLATFORM} ubuntu:20.04
调整构建命令
多平台构建时,不能直接使用"docker build"命令,而是使用"docker buildx build"命令。
这是因为"docker build"每次仅支持构建单一平台的镜像,而"docker buildx build"才支持单命令同时构建多平台镜像。
完整的构建命令如下:
docker buildx build \
–platform linux/amd64,linux/arm64 \
–tag “镜像名称”
如需构建完成后自动推送镜像,可以增加"–push"参数:
docker buildx build \
–platform linux/amd64,linux/arm64 \
–push \
–tag “镜像名称”
在不同镜像仓库之间传输镜像
命令行
skopeo copy --all docker://源镜像名 docker://目标镜像名
完成以上步骤,就可以使用Docker构建多平台镜像啦!