dockerhub 查看镜像版本_使用 docker buildx 构建多 CPU 架构镜像

引言

在工作中,遇到了需要将应用程序打包成 Docker 镜像并同时运行在不同的 CPU 架构(X86 和 ARM)的环境中。

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

不同的 CPU 架构,对于运行相同的应用程序的 Docker 容器,需要分别在相应的 CPU 架构下编译的 Docker 镜像。 要构建多架构镜像,首先想到的是每种 CPU 架构环境(物理环境或虚拟环境)下构建相应的镜像。 但目前 docker 构建环境是 X86 的,没有 ARM 环境, 或者要申请 ARM 物理机,或者要申请/创建 ARM 虚拟机,或者交叉编辑等等,听上去都比较麻烦。

经过研究,发现 docker buildx 支持构建多架构镜像,这使得构建多架构镜像变得简单。 这样就可以在 X86 架构下构建 ARM 架构的镜像。

接下来,开始实践之旅吧。

dockerhub 查看镜像版本_使用 docker buildx 构建多 CPU 架构镜像_第1张图片

环境

  • Docker Desktop(Mac)
  • Docker Engine 19.03+
dockerhub 查看镜像版本_使用 docker buildx 构建多 CPU 架构镜像_第2张图片

实践步骤

第一步,开启 docker buildx

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

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

dockerhub 查看镜像版本_使用 docker buildx 构建多 CPU 架构镜像_第3张图片

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

dockerhub 查看镜像版本_使用 docker buildx 构建多 CPU 架构镜像_第4张图片

第二步,构建多架构镜像,并推送到 Docker Hub

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

echo "FROM python:3.7-alpine”>Dockerfile

列出 builder:

$ docker buildx lsNAME/NODE DRIVER/ENDPOINT STATUS  PLATFORMSdefault * 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.7sName:   mybuilderDriver: docker-containerNodes:Name:      mybuilder0Endpoint:  unix:///var/run/docker.sockStatus:    runningPlatforms: 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 查看镜像版本_使用 docker buildx 构建多 CPU 架构镜像_第5张图片

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

dockerhub 查看镜像版本_使用 docker buildx 构建多 CPU 架构镜像_第6张图片

思考与总结

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

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 完全支持多架构镜像。

你可能感兴趣的:(dockerhub,查看镜像版本)