一、背景
在业界当前的云原生实践中,“构建一次,随处部署”的机制已经得到了普遍应用。借助容器化和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/buildx/working-with-buildx/),您可以直接创建一个多架构镜像,并利用同一条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 对多架构镜像的支持,您工作流程的最佳实践将得以保留。您仍然可以只构建一次,然后在开发、测试和生产阶段晋级您的不可变、多架构镜像。
访问JFrog官网:https://www.jfrogchina.com/,获取更多咨询