如何使用Docker构建多平台镜像?

目录

如何构建多平台镜像?
工作原理
准备构建环境
开启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构建多平台镜像啦!

猜你喜欢

转载自blog.csdn.net/weixin_44592002/article/details/131398700