多架构镜像三部曲(一)组合

本文介绍了如何在Docker中管理和构建多架构镜像,包括准备不同架构的镜像、构建多架构镜像、查看信息、推送至远程仓库及自动拉取。通过示例展示了将redis的arm64和amd64镜像同步到私有仓库的过程,探讨了manifest lists的概念,并提出了构建多架构镜像的思考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


大家好,我是温玉。今天给大家分享的内容是 “多架构镜像构建” 专题,希望给有在不同架构平台上交付应用需求的同学提供一些帮助。

多架构镜像(multi-architecture)

在企业实际业务容器化过程中会遇到同一个服务构建的镜像需要运行在不同的 CPU 架构服务器上,比较常遇到的是 ARM 架构(如 arm64/v8)和 X86 架构(amd64)。对于一个服务组件构建两个及以上的镜像 TAG 是非常不便于管理的,这这种情况下使用多架构镜像是非常不错的选择。

多架构镜像允许某个服务镜像使用一个名称关联多个不同架构功能相同的镜像。即一个镜像 TAG 中可以同时包含不同 CPU 架构、操作系统信息。在实际 docker pull 时,docker 能够自动根据当前运行的机器环境下载相关的镜像 Overlay 等数据。

在 Docker 中的镜像是由 overlay 层、大小和摘要等信息组成,这些信息统称为清单(manifest),即一个镜像的完整说明。而多架构镜像是同一个服务不同环境下的 overlay 层、大小和摘要组合而成,因此多架构镜像也称为清单列表(manifest lists)。

一般情况下 Docker 提供多架构镜像的管理方法有两种 docker manifestdocker buildx ,本次主要讨论 docker manifest 方法。

示例提供一种场景,将 redis 的 arm64 和 amd64 镜像同步到私有镜像仓库。

准备不同架构的镜像

在下载镜像时,默认 docker 会根据当前的操作系统来自动判断下载什么架构的镜像。但,本次想下载多个架构的镜像就需要使用到 docker pull --platform 命令和参数。

由于同一个镜像 TAG 在不是多架构镜像时,是不能同时保存多架构镜像相关信息的,因此在下载一个架构的镜像后,需要修改他的 TAG 便于下载其他架构的镜像。

下载 arm64 架构的 redis 镜像,并修改 tag

# docker  pull --platform arm64 redis:6.2.6
# docker tag redis:6.2.6 harbor.cncfstack.com/library/redis:6.2.6-arm64

下载 amd64 架构的 redis 镜像,并修改 tag

# docker  pull --platform amd64 redis:6.2.6
# docker tag redis:6.2.6 harbor.cncfstack.com/library/redis:6.2.6-amd64

由于多架构镜像核心是维护清单列表(manifest lists),并不是维护具体的镜像 overlay 层等信息,要求在构建多架构镜像前需要镜像推送到远程仓库中

# docker push harbor.cncfstack.com/library/redis:6.2.6-arm64
# docker push harbor.cncfstack.com/library/redis:6.2.6-amd64

docker manifest create构建多架构镜像

使用 docker manifest create 命令可以构建一个本地的多架构镜像

将 redis 的 arm64 和 amd64 镜像构建成一个多架构镜像

# docker manifest create harbor.cncfstack.com/library/redis:6.2.6-multi harbor.cncfstack.com/library/redis:6.2.6-amd64 harbor.cncfstack.com/library/redis:6.2.6-arm64
Created manifest list harbor.cncfstack.com/library/redis:6.2.6-multi

docker manifest inspect 查看多架构镜像信息

构建完成后,可以使用 docker manifest inspect 查看多架构镜像信息

# docker manifest inspect harbor.cncfstack.com/library/redis:6.2.6-multi
{
   "schemaVersion": 2,
   "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
   "manifests": [
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 1573,
         "digest": "sha256:3991cfe7ed07a7080c79a3b52e38e81caf13f9aa013b0bf588807f4637176515",
         "platform": {
            "architecture": "amd64",
            "os": "linux"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 1572,
         "digest": "sha256:6c1a95df60f12a3b014fa5c85a9c04e742eb2686db2a9f212d49974188ebf0ec",
         "platform": {
            "architecture": "arm64",
            "os": "linux",
            "variant": "v8"
         }
      }
   ]
}

docker manifest annotate 添加注释说明

修改多架构镜像中 amd64 镜像的操作系统信息。

注意命令参数需要先指定多架构镜像,然后再指定多架构镜像中某个镜像

# docker manifest annotate  --os-version "centos8" harbor.cncfstack.com/library/redis:6.2.6-multi harbor.cncfstack.com/library/redis:6.2.6-amd64

修改完成在查看,会看到多了 "os.version": "centos8" 的注释信息

# docker manifest inspect harbor.cncfstack.com/library/redis:6.2.6-multi
{
   "schemaVersion": 2,
   "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
   "manifests": [
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 1573,
         "digest": "sha256:3991cfe7ed07a7080c79a3b52e38e81caf13f9aa013b0bf588807f4637176515",
         "platform": {
            "architecture": "amd64",
            "os": "linux",
            "os.version": "centos8"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 1572,
         "digest": "sha256:6c1a95df60f12a3b014fa5c85a9c04e742eb2686db2a9f212d49974188ebf0ec",
         "platform": {
            "architecture": "arm64",
            "os": "linux",
            "variant": "v8"
         }
      }
   ]
}

docker manifest push 推送到远程仓库

然后使用 docker manifest push 将多架构镜像信息推送远程仓库

# docker manifest push  harbor.cncfstack.com/library/redis:6.2.6-multi
sha256:89762437568f959988bcd9aefe08a8b41d6031defac406a3d9e0281efe07177a

docker manifest rm 删除本地的多架构镜像

删除成功时没有提示信息

# docker manifest rm harbor.cncfstack.com/library/redis:6.2.6-multi

自动识别拉取

选择一台新的机器,如下 CPU 架构是 x86_64 的,即 AMD64 。

# uname -a
Linux cncfstack-vm1 4.9.65 #1 SMP Mon Jul 22 11:29:50 CST 2019 x86_64 GNU/Linux

下载多架构镜像

# docker pull harbor.cncfstack.com/library/redis:6.2.6-multi
6.2.6-multi: Pulling from wytest/redis
...省略...
Digest: sha256:89762437568f959988bcd9aefe08a8b41d6031defac406a3d9e0281efe07177a
Status: Downloaded newer image for harbor.cncfstack.com/library/redis:6.2.6-multi

# docker inspect harbor.cncfstack.com/library/redis:6.2.6-multi
[
    {
        "Id": "sha256:0e403e3816e890f6edc35de653396a5f379084e5ee6673a7608def32caec6c90",
        "RepoTags": [
            "harbor.cncfstack.com/libraryredis:6.2.6-multi"
        ],
         ...省略...
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 112598807,
        ...省略...
    }
]

这里没有指定 CPU 架构信息,会自动根据当前系统选择 amd64 架构的镜像层下载。

结语&思考

这里使用 docker manifest 命令是将多个架构的镜像组合在一起形成的多架构镜像,那么这里有个问题可以思考一下,是否有某种方式或工具可以直接构建出多架构镜像呢? 欢迎在评论区写下你的思考和答案,我们一起讨论,共同学习进步。如果你觉得这篇文章对你有所帮助,欢迎你把文章分享给你朋友。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值