文章目录
大家好,我是温玉。今天给大家分享的内容是 “多架构镜像构建” 专题,希望给有在不同架构平台上交付应用需求的同学提供一些帮助。
多架构镜像(multi-architecture)
在企业实际业务容器化过程中会遇到同一个服务构建的镜像需要运行在不同的 CPU 架构服务器上,比较常遇到的是 ARM 架构(如 arm64/v8)和 X86 架构(amd64)。对于一个服务组件构建两个及以上的镜像 TAG 是非常不便于管理的,这这种情况下使用多架构镜像是非常不错的选择。
多架构镜像允许某个服务镜像使用一个名称关联多个不同架构功能相同的镜像。即一个镜像 TAG 中可以同时包含不同 CPU 架构、操作系统信息。在实际 docker pull
时,docker 能够自动根据当前运行的机器环境下载相关的镜像 Overlay 等数据。
在 Docker 中的镜像是由 overlay 层、大小和摘要等信息组成,这些信息统称为清单(manifest),即一个镜像的完整说明。而多架构镜像是同一个服务不同环境下的 overlay 层、大小和摘要组合而成,因此多架构镜像也称为清单列表(manifest lists)。
一般情况下 Docker 提供多架构镜像的管理方法有两种 docker manifest
和 docker 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
命令是将多个架构的镜像组合在一起形成的多架构镜像,那么这里有个问题可以思考一下,是否有某种方式或工具可以直接构建出多架构镜像呢? 欢迎在评论区写下你的思考和答案,我们一起讨论,共同学习进步。如果你觉得这篇文章对你有所帮助,欢迎你把文章分享给你朋友。