manifest是一个文件,这个文件包含了有关于镜像信息,如层、大小和摘要。docker manifest命令还向用户提供附加信息,比如构建镜像的操作系统和体系结构。而manifest list是一个镜像清单列表,用于存放多个不同os/arch的镜像信息。我们可以创建一个manifest list来指向两个镜像(一个linux 64位和一个指向arm64位的镜像),然后对用户提供一个唯一的镜像名称。需要注意的是,manifest文件仅仅是针对于已经在仓库中的镜像!!! 换句话说,就是这个镜像是刚从仓库中pull下来的!如果这个镜像是自己build的,需要先push到仓库中,否则,这个镜像是没有manifest文件的!!同样的,如果你pull了一个镜像,tag了一下,再去看这个manifest文件,也是没有的,因为tag后的镜像不在镜像仓库中。原理如图:
docker manifest inspect testcase:1.1-x86
{
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"config": {
"mediaType": "application/vnd.docker.container.image.v1+json",
"size": 8905,
"digest": "sha256:1f1a5ca7b6fb4d7fc6db9a2f14e1d16bc44b90c5820e184a00935e1cab6ba5e8"
},
"layers": [
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 100700880,
"digest": "sha256:d76e5dbcef000b02f3f4036522ae4ceaa9d7970e2628d063bf44c3206f9ab289"
},
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 9686078,
"digest": "sha256:880892a1f81e5375141bfd0e7016d314ceb6c61447549fe124729a4195093e25"
},
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 251,
"digest": "sha256:99710925849279212fe58447c1c84645f5320ea16dc990fcead14548c46b24a5"
},
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 8058194,
"digest": "sha256:18e25d5c7da078fc613f68a7b666b6fe50afe7a7be8d27f5cb00f1b7c8b8be7e"
},
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 2527567,
"digest": "sha256:c3ce9aee3e4abf3f4ad72a9138ced72dd7f8d24e0b7e29031641fe552ad9c1d1"
},
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 6338197,
"digest": "sha256:8142096f4c3ebacf92c79b62766a8c35ed994dd97bd2a0e31e07e3d1d5a48e90"
},
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 5910548,
"digest": "sha256:0251ff1ac6b30c634f81f8d3989a3ea2773fdf7b6443d0c49c35d81926a9ef46"
},
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 101468423,
"digest": "sha256:c950d51121a16e3c6212c583d6d27d97295dbaa89a46afaae502aab6ab6b6f81"
},
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 2527566,
"digest": "sha256:1a917562fb4dbd0a1606739b563d09e50faf376672bca853e6d75990f9c23912"
},
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 5142635,
"digest": "sha256:c99fbf922e61fbb1b3fe5bc702ab1d4e0258f89448c31a7cd51270f526d51927"
},
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 29983567,
"digest": "sha256:3f92ef6a8cec4125846753c6031ac4196758edc638f747ee346f8321f46156b9"
}
]
}
docker manifest inspect testcase:1.1
{
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
"manifests": [
{
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": 2639,
"digest": "sha256:50b4f8367e33ec24108e9f4847013c1d9ad7a2a15666a349cbd4df7f85c8166f",
"platform": {
"architecture": "amd64",
"os": "linux"
}
},
{
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": 3062,
"digest": "sha256:aca640707d827b2b613bfc32b1ffbdf983790276374e33dfe03f8c3d0bd1f7e8",
"platform": {
"architecture": "arm64",
"os": "linux"
}
}
]
}
docker manifest是一个实验特性,当前在docker 20.10及其之后版本是默认支持的,在之前版本需要开启此特性,开启方法如下:
1、修改/etc/docker/daemon.json 文件,如果没有,新建并添加;如果有,追加后即可,记得检查逗号。
vim /etc/docker/daemon.json
{
"experimental": true
}
2、开启experimental,有两种方法:
方法一:临时法。设置环境变量即可,但是下次进入界面时,也需要设置(不过可以通过修改/etc/profile,使其成为永久变量)
export DOCKER_CLI_EXPERIMENTAL=enabled
方法二:永久法。修改 ~/.docker/config.json 文件,如下,有则追加,无则新建。
vim ~/.docker/config.json
{
"experimental": "enabled"
}
3、 完成上述步骤后,systemctl restart docker 即可。
从docker registry v2.3开始,Docker hub就可以pull multi architecture Docker镜像了
查看镜像manifest信息,注意多架构镜像和单架构镜像的区别,具体请查看1.1和1.2
本地创建镜像 manifest list ,用于push 到仓库
# 可以使用tag,也可以使用对应镜像的digest
docker manifest create java:1.0 java:1.0-x86 java:1.0-aarch64
--amend #用于覆盖已经存在的 manifest
用于给镜像增加其他元信息
docker manifest annotate java:1.0 java:1.0-x86 --os x86
将create 和annotate 的镜像推送到仓库
docker manifest push java:1.0
所谓多架构镜像,就是不同架构的机器均可以使用的镜像,其原理就是docker manifest,具体制作过程如下:
在不同架构的环境中,通过docker build 构建,为了使版本等归一以及统一管理,建议使用同一个Dockerfile。
如果有差异,可以使用:
[[ $(uname -p) == 'x86_64' ]]
docker manifest create --amend java:1.0 java@sha256:50b4f8367e33ec24108e9f4847013c1d9ad7a2a15666a349cbd4df7f85c8166f java@sha256:aca640707d827b2b613bfc32b1ffbdf983790276374e33dfe03f8c3d0bd1f7e8 java@sha256:b2ca8617d9de137287ec289865ac646724a0d9a7211f9bd30393746c4d80ad0b
Created manifest list java:1.0
docker manifest push -p java:1.0
sha256:38066e4595b8d2e9de922e77ab4eca49f33a73db379467bb8a673ad26fd59123
1、https://www.cnblogs.com/robinunix/p/12145874.html
2、https://blog.csdn.net/sullivan_jia/article/details/117520304
3、https://docs.docker.com/engine/reference/commandline/manifest/