前言
随着容器、芯片技术的进一步发展,以及绿色、节能、信创等方面的要求,多 CPU 架构的场景越来越常见。典型的应用场景包括:
1.信创:x86 服务器 鲲鹏 ARM 等信创服务器;2.个人电脑:苹果 Mac M1 Windows 电脑(或旧的 Intel 芯片苹果电脑);3.Edge:数据中心使用 x86 服务器,边缘 Edge 端使用低功耗的 arm 边缘设备(如树莓派等)。
容器云原生技术在这方面支持的是很好,但是实际使用中细节会有一些问题,举一个例子,就是:如何保存/同步多架构容器 Docker 镜像
本次先以将 Docker Hub 的镜像同步到本地镜像仓库为例说明。
词汇表
英文 | 中文 | 说明 |
---|---|---|
multi-arch image | 多架构镜像 | |
variant | 变体 | 不同变体指的如:redis 镜像的 arm/v5 和 arm/v7 两种变体 |
manifest | 清单 | |
manifest-list | 清单(的)列表 | |
layer | (镜像)层 | |
image index | 镜像索引 | OCI 专有名词,含义和 manifest-list 相同 |
manifest digest | 清单摘要 |
容器镜像如何支持多架构
一个多架构镜像(A multi-arch image)是一种容器镜像,它可以组合不同架构体系(如 amd64 和 arm)的变体(variants),有时还可以组合不同操作系统(如 windows 和 linux)的变体。运行支持多架构的镜像时,容器客户端会自动选择与你的 OS 和架构相匹配的镜像变体。
多架构镜像是基于镜像清单和清单列表实现的。
清单(Manifests)
每个容器镜像都由一个“清单”表示。清单是一个 JSON 文件,用于唯一标识镜像,并引用其层(layer)及其相应的大小。
hello-world
Linux 镜像的基本清单类似于以下内容:
{
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.v2 json",
"config": {
"mediaType": "application/vnd.docker.container.image.v1 json",
"size": 1510,
"digest": "sha256:fbf289e99eb9bca977dae136fbe2a82b6b7d4c372474c9235adc1741675f587e"
},
"layers": [
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 977,
"digest": "sha256:2c930d010525941c1d56ec53b97bd057a67ae1865eebf042686d2a2d18271ced"
}
]
}
清单列表 (Manifest-lists)
多架构镜像的清单列表(通常称为 OCI 镜像 的镜像索引[1])是镜像的集合(索引),您可以通过指定一个或多个镜像名称来创建一个。它包括有关每个镜像的详细信息,例如支持的操作系统和体系架构、大小和清单摘要 (manifest digest)。清单列表的使用方式与 docker pull
和 docker run
命令 中的镜像名称相同。
docker[2] CLI 使用 docker manifest
命令管理清单和清单列表。