Docker的Pull Digest和Image ID

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:

docker的image id和digest

既然你看到这篇文章,你肯定已经用过Docker,并且Pull过镜像,所以下面这条命令你肯定不会陌生

# docker pull registry.aliyuncs.com/jiangjizhong/busybox:latest
latest: Pulling from jiangjizhong/busybox
8ddc19f16526: Pull complete
Digest: sha256:a59906e33509d14c036c8678d687bd4eec81ed7c4b8ce907b888c607f6a1e0e6
Status: Downloaded newer image for registry.aliyuncs.com/jiangjizhong/busybox:latest    

有没有注意过输出内容里的Digest,知道它是什么意思吗?

你肯定还用过docker images命令,

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
registry.aliyuncs.com/jiangjizhong/busybox   latest              2b8fd9751c4c        3 weeks ago         1.093 MB

你能说出输出里的IMAGE ID表示的是什么意思吗?

如果你已经知道上面两个问题的答案,现在可以关掉浏览器了,这篇文章的内容对你来说太浅显了。如果你回答不上来,没关系,继续看下去,马上你就搞清楚这些问题。

由于Docker1.10和Registry 2.3对镜像和Manifest格式都有很大的变更,所以下面的内容都是基于Docker1.10+和Registry2.3+,不要留恋老版本,让它随风去吧。

Docker镜像的构成

Docker镜像包含两部分内容:一组有序的层(Layer)和相应的创建容器时要用的参数构成。我们可以分别通过docker historydocker inspect这两个命令查看层和镜像参数。

# docker history registry.aliyuncs.com/jiangjizhong/busybox
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
2b8fd9751c4c        3 weeks ago         /bin/sh -c #(nop) CMD ["sh"]                    0 B
<missing>           3 weeks ago         /bin/sh -c #(nop) ADD file:9ca60502d646bdd815   1.093 MB

启动一个容器之后,我们可以看到容器里有一个完整的文件系统,容器里所有的文件都来自构成镜像的层。

每个层里都存放的是相对于上一个层的文件的变更,比如增加了几个文件,修改了几个文件,删除了几个文件等等。Docker通过诸如aufs之类的技术,把所有的层挂载到同一个目录上,形成了我们在容器里看到的完整的目录结构。

把层里所有的文件打包成一个tar,对它计算sha256sum,得到的就是层id(LayerId)

Docker1.10开始,Layer里只包含文件变更,不再包含配置信息,所有的配置信息都属于镜像。

ImageID和Digest

Pull分为两步,第一步是下载Manifest。Manifest里包含了前面所说的配置文件和层列表。我们可以模拟这个过程,下载busybox的Manifest文件看看。

#!/bin/env  python

from __future__ import print_function

import requests
import json

auth = requests.get('https://dockerauth.aliyuncs.com/auth?scope=repository%3Ajiangjizhong%2Fbusybox%3Apull&service=registry.aliyuncs.com')
token = json.loads(auth.text)['token']

headers = {
        'Authorization': 'Bearer %s' % (token),
        'Accept': 'application/vnd.docker.distribution.manifest.list.v2+json',
        'Accept': 'application/vnd.docker.distribution.manifest.v1+prettyjws',
        'Accept': 'application/json',
        'Accept': 'application/vnd.docker.distribution.manifest.v2+json'
        }
manifest = requests.get('https://registry.aliyuncs.com/v2/jiangjizhong/busybox/manifests/latest', headers=headers)
print('Docker Content Digest: %s' % manifest.headers['docker-content-digest'])
print(manifest.text, end='')

把上面的代码保存为manifest.py,执行python manifest.py,输出如下

Docker Content Digest: sha256:a59906e33509d14c036c8678d687bd4eec81ed7c4b8ce907b888c607f6a1e0e6
{
    "layers": [
        {
            "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
            "digest": "sha256:8ddc19f16526912237dd8af81971d5e4dd0587907234be2b83e249518d5b673f",
            "size": 667590
        }
    ],
    "schemaVersion": 2,
    "config": {
        "mediaType": "application/octet-stream",
        "digest": "sha256:2b8fd9751c4c0f5dd266fcae00707e67a2545ef34f9a29354585f93dac906749",
        "size": 1459
    },
    "mediaType": "application/vnd.docker.distribution.manifest.v2+json"
}

我特地输出的响应头的docker-content-digest,它的值是sha256:a59906e33509d14c036c8678d687bd4eec81ed7c4b8ce907b888c607f6a1e0e6,有没有觉得眼熟?没错!本文最开始的Docker Pull输出里的Digest就是这个值。这个值实际上是manifest内容的sha256sum。注意看Manifest内容的config部分,你可以找到一个digest,这个值是不是也很眼熟,它就是docker images输出的镜像ID,镜像的ID是镜像配置文件的sha256sum,我们可以用它继续从Registry上下载镜像配置文件。

目录
相关文章
|
Linux Docker Windows
docker pull 报错解决:error pulling image configuration: Get https:..
docker pull 报错解决:error pulling image configuration: Get https:..
4430 0
|
9月前
|
Ubuntu Linux Shell
(已解决)Linux环境—bash: wget: command not found; Docker pull报错Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled
(已成功解决)Linux环境报错—bash: wget: command not found;常见Linux发行版本,Linux中yum、rpm、apt-get、wget的区别;Docker pull报错Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled
4489 69
(已解决)Linux环境—bash: wget: command not found; Docker pull报错Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled
|
6月前
|
数据安全/隐私保护 Docker 容器
docker pull 相关配置
通过本文的介绍,您已经了解了如何通过镜像源配置、登录私有仓库、设置网络代理以及其他优化策略来提升 `docker pull`命令的效率和可靠性。这些配置不仅能够显著加快镜像下载速度,还能确保在不同网络环境下的稳定性。通过合理使用这些配置,您可以更好地管理和优化Docker环境中的镜像拉取操作。
728 18
|
7月前
|
存储 运维 应用服务中间件
Docker Image即Docker镜像
Docker 镜像是 Docker 容器的基础,包含了运行应用程序所需的一切。通过 Dockerfile 可以方便地创建自定义镜像,并且利用 Docker 提供的命令可以轻松管理和使用这些镜像。掌握 Docker 镜像的创建、管理和使用,是进行容器化应用开发和部署的基础技能。希望本文能帮助读者更好地理解 Docker 镜像的概念和操作,提高开发和运维效率。
1085 13
|
8月前
|
关系型数据库 MySQL Docker
docker pull mysql:8.0.26提示Error response from daemon: Get “https://registry-1.docker.io/v2/“: EOF错误
docker pull mysql:8.0.26提示Error response from daemon: Get “https://registry-1.docker.io/v2/“: EOF错误
|
11月前
|
网络协议 Docker 容器
docker pull命令拉取镜像失败的解决方案
docker pull命令拉取镜像失败的解决方案
5441 1
|
11月前
|
搜索推荐 应用服务中间件 nginx
docker与containerd镜像获取及导出导入的区别与注意事项(报错信息:ctr: content digest sha256........ac47: not found)
docker与containerd镜像获取及导出导入的区别与注意事项(报错信息:ctr: content digest sha256........ac47: not found)
775 2
|
11月前
|
网络虚拟化 Docker 容器
docker Desktop报错 error pulling image configuration 处理
docker Desktop报错 error pulling image configuration 处理
193 0
|
11月前
|
Docker 容器
docker可以通过镜像id导出镜像吗?
docker可以通过镜像id导出镜像吗?
227 0
|
11月前
|
缓存 Ubuntu 网络安全
docker pull失败:x509: certificate has expired or is not yet
遇到“x509: certificate has expired or is not yet valid”错误时,首要步骤是校正系统时间并确保Docker客户端是最新的。如果问题依旧,检查和更新证书或考虑使用镜像加速服务也是可行的解决方案。通过这些步骤,大多数与证书相关的 `docker pull`问题都能得到有效解决。
1403 0