一、背景
在业界以后的云原生实际中,“构建一次,随处部署”的机制曾经失去了广泛利用。借助容器化和 Docker,咱们能够为任何环境构建利用和服务,并在运行时再设置配置。
不过,这种适应性还是有一些限度。操作系统和应用程序依然须要编译能力在特定的架构类型上执行。例如,为 AMD64 处理器编译的软件不能在基于 ARM 的机器上运行,为 Linux 构建的软件也不能在 Windows 上运行。
Docker 通过反对多架构(multi-arch)镜像满足了容器利用的多 CPU 架构的需要。您能够为须要反对的每个架构构建独自的镜像,而后作为一个汇合将所有镜像绑定在 Docker 清单的列表中。而后,您能够通过其名称和标签部署生成的多架构镜像——Docker 客户端将主动抉择与指标架构匹配的镜像。
基于 Artifactory 的 Docker 仓库能够很不便地构建多架构镜像,而且能够像治理其余任何 Docker 镜像一样来治理这些多架构镜像。本文咱们将向您展现如何在开发 / 交付流程流程中来创立和治理多架构 Docker 镜像。
二、构建多架构镜像
多架构镜像
在本文的例子中,咱们须要创立一个应用程序,必须可能在 Linux 操作系统下如下的两种处理器架构上运行:
x86-64 环境,例如 Linux 桌面;
AWS EC2 上基于 ARM 的 A1 实例。
为了可能在任何一个上运行,咱们须要一个反对 amd64 和 arm64 架构的多架构镜像。
基于 Buildx 创立多架构镜像
首先,咱们的 DockerFile 必须配置为依据所需的架构来创立示例镜像,如下所示:
ARG ARCH=
FROM ${ARCH}debian:buster-slim
RUN apt-get update \
&& apt-get install – y curl \
&& rm -rf /var/lib/apt/lists/*
ENTRYPOINT [“curl”]
如果咱们应用这个 DockerFile 运行 docker build 命令,并应用 –build-arg 选项来设置 ARCH 参数,咱们能够为每个所需的架构构建一个独立的镜像。而后咱们须要构建一个独自的清单列表(应用 docker manifest 命令)将它们绑定到一个多架构镜像中。
除此之外,还有一种更简略、更举荐的办法。应用 Docker CLI 的 Buildx 插件(参见 https://docs.docker.com/build…),您能够间接创立一个多架构镜像,并利用同一条 Docker CLI 命令即将构建好的多架构镜像推送到 Artifactory 中的 Docker 仓库里。如下所示:
$ docker buildx build \
–push \
–platform linux/amd64,linux/arm64 \
–output=type=image,push=true,registry.insecure=true \
–tag myartifactory/docker-local /multiarch-image:tag .
如果您应用的是 Mac 或 Windows 上的 Docker Desktop,那么 Buildx 曾经随着装好了。如果您应用的是 Linux,则能够从 GitHub 装置 Buildx。
(参见 https://github.com/docker/buildx)
Artifactory 里的多架构镜像
以下是上一节创立的 multiarch-image 多架构镜像在 Artifactory 中的存储形式,该镜像存储在名为 docker-local 的 Docker 仓库中。
► Docker 清单列表
Docker 生成的清单列表(list.manifest.json)是多架构镜像“镜像清单的清单”,也称为“富清单”,它标识了汇合中的 Docker 镜像以及每个镜像要运行的架构(操作系统和处理器组合)。
当 multiarch-image 利用运行时,Docker CLI 将首先拉取清单列表,而后应用它来抉择拉取和部署哪个镜像,以匹配指标地的操作系统和架构。
► 架构镜像
每个被反对架构的镜像都有本人的标签,能够通过它来寻址,这个标签是 Artifactory 通过组合公布标签和架构名称来创立的。因为咱们的示例应用公布标签“tag”,因而架构镜像的标签是 tag-linux-amd64 和 tag-linux-arm64。
每个镜像也有本人的清单,用于标识组成它的层。
三、升级多架构镜像
一旦您的多架构镜像位于 Artifactory 的 Docker 仓库并通过了测试,您就能够将该镜像升级到下一个成熟度的 Docker 仓库,就像其余任何类型的制品仓库一样。
如下的 JFrog CLI 命令将咱们在 docker-local 仓库中创立的多架构映像升级到 docker-target 仓库中:
$ jfrog rt docker-promote –copy \
multiarch-image docker-local docker-target
与任何通常的 Docker 镜像一样,您也能够将升级限度为镜像中的某个标签。如果您抉择在升级中重命名标签,它将为多架构镜像中的每个架构重命名。命令如下:
$ jfrog rt docker-promote –copy \
–source-tag“latest”–target-tag“latest-new”\
multiarch-image docker-local docker-target
四、总结
在整个软件开发生命周期(SDLC)中交付多架构镜像可能意味着更简单的测试和验证,因为每个受反对的架构都可能须要在其指标平台上独自验证。
然而通过 Artifactory 对多架构镜像的反对,您工作流程的最佳实际将得以保留。您依然能够只构建一次,而后在开发、测试和生产阶段升级您的不可变、多架构镜像。