欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用 docker buildx 构建多 CPU 架构镜像

程序员文章站 2022-05-25 09:08:07
...

本文来自于【阿里云官方镜像站:https://developer.aliyun.com/mirror/?utm_content=g_1000307095 】

原文链接:https://developer.aliyun.com/article/761569?spm=a2c6h.12873581.0.0.484f7e46SbqQDx

镜像下载、域名解析、时间同步请点击 阿里巴巴开源镜像站

一、概述

ARM 架构与 X86 相比,ARM 低功耗、移动市场占比高,X86 高性能、服务器市场占比高。

不同的 CPU 架构,对于运行相同的应用程序的 Docker 容器,需要分别在相应的 CPU 架构下编译的 Docker 镜像。

传统的构建多架构镜像的方法又比较麻烦,所以接下来将为大家介绍如何使用 docker buildx 构建多架构镜像。通过在 X86 架构下构建 ARM 架构的镜像的方式,使得构建多架构镜像变得更简单。

二、环境

Docker Desktop(Mac)

Docker Engine 19.03+

三、操作步骤

1. 开启 docker buildx

docker buildx 目前还是试验功能,默认没有开启,需要在 Docker Desktop 的首选项中开启它

Docker —>Preferences —>Command Line —> Enable experimental features

执行 docker buildx 命令,输出截图如下:

2. 构建多架构镜像,并推送到 Docker Hub

写个简单的 Dockerfile,仅做演示:

echo "FROM python:3.7-alpine”>Dockerfile

列出 builder:

$ docker buildx ls

NAME/NODE DRIVER/ENDPOINT STATUS PLATFORMS

default * docker

default default running linux/amd64, linux/arm64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6

我们当前使用的是默认的 builder,它基本上是旧的 builder。

让我们创建一个新的 builder,它使我们能够访问一些新的多架构结构功能。

创建 builder:

$ docker buildx create --use --name mybuildermybuilder

查看 builder:

$ docker buildx inspect --bootstrap

[+] Building 18.8s (1/1) FINISHED

=> [internal] booting buildkit 18.8s

=> => pulling image moby/buildkit:buildx-stable-1 18.0s

=> => creating container buildx_buildkit_mybuilder0 0.7s

Name: mybuilder

Driver: docker-container

Nodes:Name: mybuilder0

Endpoint: unix:///var/run/docker.sock

Status: running

Platforms: linux/amd64, linux/arm64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6

构建多架构镜像,并推送到 Docker Hub:

docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t donhui/multiarch --push .

该 --platform 标志指示 buildx 要为 Intel 64位、Arm 32位和 Arm 64位架构生成 Linux 镜像。

该 --push 标志生成一个多架构清单,并将所有镜像推送到 Docker Hub。

在 DockerHub 查看该镜像,latest tag 下有三个镜像,当在不同的架构 pull 该 tag 时会根据其环境 pull 相应架构的镜像:

四、思考与总结

实践中不断产生疑问,不断思考,不断求解,或许你也会有同样的问题:

1、多架构镜像对 docker 版本有何要求?

构建时要用到 docker buildx 命令,docker 版本需要 19.03+;

运行时 docker 版本不一定需要 19.03+,笔者使用 1.13.1 和 18.06.1 都可以 pull 多架构镜像的。

2、所有 Dockerfile 都可以构建成多架构吗?还是有什么要求?

对 Dockerfile 没有要求,任何 Dockerfile 无需修改。

3、镜像构建后默认保存在构建缓存中,如何将镜像保存在本地?

可以将 type 指定为 docker,但必须分别为不同的 CPU 架构构建不同的镜像,不能合并成一个镜像,如:

docker buildx build -t donghui/multiarch-armv7 --platform=linux/arm/v7 -o type=docker .

docker buildx build -t donghui/multiarch-arm64 --platform=linux/arm64 -o type=docker .

docker buildx build -t donghui/multiarch-amd64 --platform=linux/amd64 -o type=docker .

也可以将镜像 push 到镜像仓库后,再进行 pull。

4、只支持推送到 Docker Hub 吗?如果要推送到私有镜像仓库,对私有镜像仓库有什么要求?

也可以将镜像推送到私有镜像仓库,但需要该镜像仓库支持多架构镜像的功能。

如果要将多架构镜像推送到 Harbor,需要 Harbor 的版本为 v2.0.0。

Harbor v2.0.0 于 2020/05/13 发布,Harbor v2.0.0 完全支持多架构镜像。

Harbor v2.0.0 更新日志:https://github.com/goharbor/harbor/releases/tag/v2.0.0