[toc]
有时候,我们需要从google下载镜像,但是由于网络原因又下载不下来。此时,网上有教程说,阿里云同步了google的镜像,从阿里云下载就可以了。
然而,我们担心,阿里云上的镜像与google上的镜像,内容是否一样呢(镜像层一样)?本文将介绍如何判断两个镜像,内容是否一样。
## **根据Digest**
#### **同一台主机,不同Registry**
有人说,我们在本地有两个不同Registry来源的镜像,能不能根据Digest来判断两个镜像内容是否一样?答案为“否”。
我们回顾前两节的内容,镜像的Digest是镜像的Manifest文件哈希值。Manifest文件在本地是没有存储的,只在Registry端才有存储。如果再回顾Digest文件的内容,大致如下:
```
{
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"config": {
"mediaType": "application/vnd.docker.container.image.v1+json",
"size": 3017,
"digest": "sha256:c6c14b3960bdf9f5c50b672ff566f3dabd3e450b54ae5496f326898513362c98"
},
"layers": [
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 2310286,
"digest": "sha256:e110a4a1794126ef308a49f2d65785af2f25538f06700721aad8283b81fdfa58"
},
...
]
}
```
根据上面的内容可以发现,镜像的Manifest文件在Registry端的存储是有版本(schemaVersion)和类型(mediaType)的。
**也就是说,对于同一个镜像,上传到不同的Registry,其Manifest文件的内容在不同的Registry中可能不一样。即同一个镜像,在不同的Registry中的Digest可能不一样**
我们可以做如下的实验,首先我们从docker hub下载一个镜像`registry:2.5.0`
```
$ docker pull registry:2.5.0
2.5.0: Pulling from library/registry
e110a4a17941: Pull complete
2ee5ed28ffa7: Pull complete
d1562c23a8aa: Pull complete
06ba8e23299f: Pull complete
802d2a9c64e8: Pull complete
Digest: sha256:1b68f0d54837c356e353efb04472bc0c9a60ae1c8178c9ce076b01d2930bcc5d
Status: Downloaded newer image for registry:2.5.0
$ docker images --digests
REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE
registry 2.5.0 sha256:1b68f0d54837c356e353efb04472bc0c9a60ae1c8178c9ce076b01d2930bcc5d c6c14b3960bd 3 years ago 33.3MB
```
接着,我们把这个镜像重新打一个tag
```
$ docker tag registry:2.5.0 10.142.232.151:8021/library/registry:2.5.0
$ docker images --digests
REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE
10.142.232.151:8021/library/registry 2.5.0 <none> c6c14b3960bd 3 years ago 33.3MB
registry 2.5.0 sha256:1b68f0d54837c356e353efb04472bc0c9a60ae1c8178c9ce076b01d2930bcc5d c6c14b3960bd 3 years ago 33.3MB
```
此时,我们竟然发现,重新打上tag的镜像`10.142.232.151:8021/library/registry:2.5.0`竟然没有Digest。
接着,我们把这个镜像上传到我们自已搭建的Harbor仓库`10.142.232.151:8021`中
```
$ docker push 10.142.232.151:8021/library/registry:2.5.0
The push refers to repository [10.142.232.151:8021/library/registry]
3bb5bc5ad373: Pushed
35039a507f7a: Pushed
d00444e19d65: Pushed
aa3a31ee27f3: Pushed
4fe15f8d0ae6: Pushed
2.5.0: digest: sha256:bf0b4fc3833f908017d650af94071d62a12390020b30658dd623b98b80af81ed size: 1363
```
根据push的输出日志,我们看到Harbor返回了一个Digest,值为`sha256:bf0b4fc3833f908017d650af94071d62a12390020b30658dd623b98b80af81ed`,与`registry:2.5.0`的digest不一样
```
$ docker images --digests
docker images --digests
REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE
10.142.232.151:8021/library/registry 2.5.0 sha256:bf0b4fc3833f908017d650af94071d62a12390020b30658dd623b98b80af81ed c6c14b3960bd 3 years ago 33.3MB
registry 2.5.0 sha256:1b68f0d54837c356e353efb04472bc0c9a60ae1c8178c9ce076b01d2930bcc5d c6c14b3960bd 3 years ago 33.3MB
```
也说是说,同一个镜像,存储在不同的Registry端,其Digest是不一样的。
#### **相同Registry,不同主机**
假如我们在两台不同的主机上下载`registry:2.5.0`,那么它的Digest是否一样呢?两台主机上下载下来的镜像是否是同一个呢?
答案是,不同主机从同一个Registry下载相同名字的镜像,两台主机上的镜像的Digest可能是一样的,如果一样,也不能表明两台主机上下载的是同一个镜像。
比如我们在amd主机上和arm主机上下载镜像`centos:7`,我们会发现,两台主机上镜像的Digest是一样的,但ImageID与镜像大小不一样
```
[root@amd] $ docker images --digests
REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE
centos 7 sha256:4a701376d03f6b39b8c2a8f4a8e499441b0d567f9ab9d58e4991de4472fb813c 5e35e350aded 6 weeks ago 203MB
```
```
[root@arm] $ docker images --digests
REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE
centos 7 sha256:4a701376d03f6b39b8c2a8f4a8e499441b0d567f9ab9d58e4991de4472fb813c 4dfd99be812b 6 weeks ago 273MB
```
## **根据ImageID**
#### **同一台主机,不同镜像名**
如果两个镜像(名字不同)在同一台主机上的ImageID是一样的,那么这两个镜像就是同一个镜像(内容是一样的)。如果在同一台主机上,两个名字的镜像的ImageID不一样,那么这两个镜像肯定不是同一个镜像。
#### **相同Registry,不同主机**
假如我们在两台不同的主机上下载`registry:2.5.0`,那么它的ImageID是否一样呢?两台主机上下载下来的镜像是否是同一个呢?
参考上文的Digest中的“相同Registry,不同主机”
## **总结**
#### **可以确定两个镜像一样的方法**
* 如果两个镜像的ImageID一样,那么这两个镜像一样,不管两个镜像在同一台主机上,或者不是同一台主机上(一般对于同一个镜像,如果两台主机的存储驱动一样,这两个镜像的ImageID一般是一样的)
- 安装
- 在线安装
- 离线安装
- 下载镜像
- 下载DockerHub镜像
- 下载Google镜像
- 阿里云镜像中心
- 下载ARM镜像
- 容器命名空间
- Linux命名空间概述
- 根据PID快速定位到容器
- 进入到容器的命名空间
- Dockerfile
- 基本语法
- 前台运行
- 镜像存储
- 本地存储
- Registry中的存储
- 如何判断两个镜像是否是同一个
- Registry
- Notification
- Auth
- 基本原理
- Token认证的设计
- API
- Pull镜像
- Push镜像
- Docker设置代理
- 日志
- 磁盘占用与清理
- Docker选项与K8S的Yaml
- 运维总结
- 常用命令
- DockerCompose
- 构建ARM版本
- 跨架构
- x86架构下构建arm64镜像
- Containerd
- ctr-crictl-nerdctl
- ctr
- Insecure-Registry
- Kata
- 构建OS镜像
- 进入到kata虚机