docker manifest 学习使用

一、概念介绍

manifest是一个文件,这个文件包含了有关于镜像信息,如层、大小和摘要。docker manifest命令还向用户提供附加信息,比如构建镜像的操作系统和体系结构。而manifest list是一个镜像清单列表,用于存放多个不同os/arch的镜像信息。我们可以创建一个manifest list来指向两个镜像(一个linux 64位和一个指向arm64位的镜像),然后对用户提供一个唯一的镜像名称。需要注意的是,manifest文件仅仅是针对于已经在仓库中的镜像!!! 换句话说,就是这个镜像是刚从仓库中pull下来的!如果这个镜像是自己build的,需要先push到仓库中,否则,这个镜像是没有manifest文件的!!同样的,如果你pull了一个镜像,tag了一下,再去看这个manifest文件,也是没有的,因为tag后的镜像不在镜像仓库中。原理如图:

在这里插入图片描述

1.1、单独架构镜像manifest 查看

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"
		}
	]
}

1.2、多架构镜像manifest 信息查看

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"
         }
      }
   ]
}

二、使用环境

2.1、docker 服务端支持

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 即可。

2.2、docker registry 支持

从docker registry v2.3开始,Docker hub就可以pull multi architecture Docker镜像了

三、命令介绍

3.1、docker manifest inspect

查看镜像manifest信息,注意多架构镜像和单架构镜像的区别,具体请查看1.1和1.2

3.2、docker manifest create

本地创建镜像 manifest list ,用于push 到仓库

# 可以使用tag,也可以使用对应镜像的digest
docker manifest create java:1.0 java:1.0-x86 java:1.0-aarch64


--amend #用于覆盖已经存在的 manifest

3.3、docker manifest annotate

用于给镜像增加其他元信息

docker manifest annotate java:1.0 java:1.0-x86 --os x86

3.4、docker manifest push

将create 和annotate 的镜像推送到仓库

docker manifest push java:1.0

四、制作多架构镜像

所谓多架构镜像,就是不同架构的机器均可以使用的镜像,其原理就是docker manifest,具体制作过程如下:

4.1、构建不同架构的镜像

在不同架构的环境中,通过docker build 构建,为了使版本等归一以及统一管理,建议使用同一个Dockerfile。

如果有差异,可以使用:

[[ $(uname -p) == 'x86_64' ]]

4.2、创建manifest

docker manifest create --amend java:1.0   java@sha256:50b4f8367e33ec24108e9f4847013c1d9ad7a2a15666a349cbd4df7f85c8166f java@sha256:aca640707d827b2b613bfc32b1ffbdf983790276374e33dfe03f8c3d0bd1f7e8      java@sha256:b2ca8617d9de137287ec289865ac646724a0d9a7211f9bd30393746c4d80ad0b  

Created manifest list java:1.0

4.3、push manifest

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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值