1.引子
Digest: sha256:bb129a712c2431ecce4af8dde831e980373b26368233ef0f3b2bae9e9ec515ee
ImageID:c316d5a335a5
Digest 和 ImageID区别和联系?
[root@liuliu .docker]# docker pull nginx@sha256:bb129a712c2431ecce4af8dde831e980373b26368233ef0f3b2bae9e9ec515ee
docker.io/library/nginx@sha256:bb129a712c2431ecce4af8dde831e980373b26368233ef0f3b2bae9e9ec515ee: Pulling from library/nginx
5eb5b503b376: Already exists
1ae07ab881bd: Pull complete
78091884b7be: Pull complete
091c283c6a66: Pull complete
55de5851019b: Pull complete
b559bad762be: Pull complete
Digest: sha256:bb129a712c2431ecce4af8dde831e980373b26368233ef0f3b2bae9e9ec515ee
Status: Downloaded newer image for nginx@sha256:bb129a712c2431ecce4af8dde831e980373b26368233ef0f3b2bae9e9ec515ee
docker.io/library/nginx@sha256:bb129a712c2431ecce4af8dde831e980373b26368233ef0f3b2bae9e9ec515ee
[root@liuliu .docker]# docker images --digests | grep nginx
nginx <none> sha256:bb129a712c2431ecce4af8dde831e980373b26368233ef0f3b2bae9e9ec515ee c316d5a335a5 2 weeks ago 142MB
2.Image Index 和 Manifest 和 config
2.1.Image Index
ImageIndex 又称fat manifest
,manifest list
,主要作用就是:构建多CPU架构的镜像
[root@node1 ~]# docker manifest inspect nginx
{
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
"manifests": [
{
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": 1570,
"digest": "sha256:bb129a712c2431ecce4af8dde831e980373b26368233ef0f3b2bae9e9ec515ee",
"platform": {
"architecture": "amd64",
"os": "linux"
}
},
{
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": 1570,
"digest": "sha256:2d5caa26de50de8f53779007669c67ae03b14ccd61f3ace2da5b5857e97e821b",
"platform": {
"architecture": "arm",
"os": "linux",
"variant": "v5"
}
},
...
}
]
}
2.2.Manifest
Manifest 作用:主要存在registry中作为docker镜像的元数据文件,在pull,push,save,load中作为镜像结构和基础信息的描述文件。在镜像pull或者load到宿主机时,manifest被转为本地镜像配置文件config
Manifest json文件我们需要关注这些字段:config.digest == 这个就是image ID
,layers 层的digest
[root@node1 ~]# docker manifest inspect nginx@sha256:bb129a712c2431ecce4af8dde831e980373b26368233ef0f3b2bae9e9ec515ee
{
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"config": {
"mediaType": "application/vnd.docker.container.image.v1+json",
"size": 7657,
"digest": "sha256:c316d5a335a5cf324b0dc83b3da82d7608724769f6454f6d9a621f3ec2534a5a"
},
"layers": [
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 31366257,
"digest": "sha256:5eb5b503b37671af16371272f9c5313a3e82f1d0756e14506704489ad9900803"
},
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 25352768,
"digest": "sha256:1ae07ab881bd848493ad54c2ba32017f94d1d8dbfd0ba41b618f17e80f834a0f"
},
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 601,
"digest": "sha256:78091884b7bea0fa918527207924e9993bcc21bf7f1c9687da40042ceca31ac9"
},
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 893,
"digest": "sha256:091c283c6a66ad0edd2ab84cb10edacc00a1a7bc5277f5365c0d5c5457a75aff"
},
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 666,
"digest": "sha256:55de5851019b8f65ed6e28120c6300e35e556689d021e4b3411c7f4e90a9704b"
},
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 1394,
"digest": "sha256:b559bad762bec166fd028483dd2a03f086d363ee827d8c98b7268112c508665a"
}
]
}
如下只讨论ImageIndex ,imagemanifest,Imageconfig
imageIndex 和 Imagemanifest 是一对多的关系
imagemanifest 和 imageconfig 是一对一的关系
拉取镜像的流程
第一步:找到ImageIndex(里面由manifests 列表,找到manifest)
第二步:找到manifest
第三步:下载imageconfig 和 layers
通过docker manifest inspect busybox:latest 命令看下的 ImageIndex 文件格式
{
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
"manifests": [ // manifest集合,可能是arm 架构,也可能是amd架构,等等,下载镜像会检测匹配
{
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": 527,
"digest": "sha256:99243e861067446c9aed305b5690cccb88658d23af3fde338398f27386ded1be", // 这个就是manifest文件的指纹
"platform": {
"architecture": "amd64", // amd64架构
"os": "linux" // 适用于linux 系统
}
}
...
]
}
来看下manifest.json文件的格式(随便找的一个格式,和busybox上述版本不一致)。
Digest: sha256:9fd67116449f225c6ef60d769b5219cf3daa831c5a0a6389bbdd7c952b7b352d 这个值就是这个manifest.json做的sha256sum 的指纹值
{
"layers": [
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"digest": "sha256:8ddc19f16526912237dd8af81971d5e4dd0587907234be2b83e249518d5b673f", //这个是各个层对应的文件
"size": 667590
}
],
"schemaVersion": 2,
"config": {
"mediaType": "application/octet-stream",
"digest": "sha256:a77dce18d0ecb0c1f368e336528ab8054567a9055269c07c0169cba15aec0291", // 这个就是我们的镜像Id ,就是image confg 对应的文件
"size": 1459
},
"mediaType": "application/vnd.docker.distribution.manifest.v2+json"
}
拉取镜像文件在哪里
docker pull busybox@sha256:99243e861067446c9aed305b5690cccb88658d23af3fde338398f27386ded1be
docker images ls | grep busy
busybox <none> a77dce18d0ec 5 days ago 1.24MB
docker images --digests | grep busybox
busybox <none> sha256:99243e861067446c9aed305b5690cccb88658d23af3fde338398f27386ded1be a77dce18d0ec 5 days ago 1.24MB
# 注意此时mamifest.json文件对应的指纹为:99243e861067446c9aed305b5690cccb88658d23af3fde338398f27386ded1be
# 对应的imageid a77dce18d0ec
cd /var/lib/docker/image/overlay2
vim repositories.json
# 主要看下面这段,我们要找到imgeid
"busybox": {
"busybox@sha256:99243e861067446c9aed305b5690cccb88658d23af3fde338398f27386ded1be": "sha256:a77dce18d0ecb0c1f368e336528ab8054567a9055269c07c0169cba15aec0291"
},
cd /var/lib/docker/image/overlay2/imagedb/content/sha256
# 找到 a77dce18d0ecb0c1f368e336528ab8054567a9055269c07c0169cba15aec0291 文件,对这个文件做sha256sum 得到就是a77dce18d0ecb0c1f368e336528ab8054567a9055269c07c0169cba15aec0291 这个就是imageid
总结
Image Index 就是manifest 的集合
manifest 记录了image config 和 layers