云原生干货 | 如何使用Docker构建多平台镜像?

2023-06-27

876

如何构建多平台镜像?


如果你还不了解什么是多平台构建,请先阅读一下Docker构建多平台镜像的文档:https://docs.docker.com/build/building/multi-platform/


官方文档里给出了3种多平台镜像的构建方式,本文推荐使用第3种方式,即Dockerfile多平台构建的方式。采用这种方式的好处是不用针对每种平台准备一份Dockerfile,只需要调整构建镜像的参数就能同时支持多平台构建。


工作原理


要让Docker支持多平台构建,需要满足以下几个条件:


1、 Linux内核开启多处理器架构支持;

2、构建时使用基于"docker-container"驱动的Buildx实例;

3、使用"docker buildx build"命令构建镜像;

4、构建命令必须指定"–platform"参数;

5、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构建多平台镜像啦!






更多云原生干货文章,请点击查阅>>


技术交流
我们建立了多个云原生技术交流群,其中有来自Oracle、Citrix、华为、腾讯等国内外云计算专家,立即扫码,拉你进群。目前已有2000+开发者加入我们......
云原生厂商 云原生技术服务商
在云原生时代,行云创新致力于通过赋能开发者,实现企业快速迭代与交付,大幅提升创新效率。
产品下载