Docker的Pull Digest和Image ID

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上下载镜像配置文件。

时间: 2024-12-13 09:32:53

Docker的Pull Digest和Image ID的相关文章

docker search, pull, login, push with Docker Hub - public registry

docker HUB是一个公共的image registry, 不注册账号的话, 可以从docker hub下载public image. docker search, pull操作不需要登录docker hub就可以对public image进行检索和下载. 如果需要将本地的image 推送到docker hub, 那么你需要注册一个docker hub的账号, 登录, 然后执行push即可. docker hub的免费用户只能保存public image. 也就是说大家都能搜到并下载你的im

【区块链】DOCKER部署量子链私有网络环境以及部署智能合约实践

DOCKER部署量子链私有网络环境以及部署智能合约实践 安装环境 安装Docker https://store.docker.com/editions/community/docker-ce-desktop-mac 这里安装的是CE的稳定版 xiaoyu@LIXIAOYUdeMacBook-Pro.com docker version Client: Version: 17.09.0-ce API version: 1.32 Go version: go1.8.3 Git commit: afd

初识docker—创建WEB应用容器1python+flask

初识docker-创建WEB应用容器1python+flask Docker 客户端 docker 客户端非常简单 ,我们可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项. runoob@runoob:~# docker 可以通过命令 docker command --help 更深入的了解指定的 Docker 命令使用方法. 例如我们要查看 docker stats 指令的具体使用方法: runoob@runoob:~# docker stats --help 运行

Docker基础之十: 存储镜像到Docker Hub

存储镜像到Docker Hub (对Docker感兴趣的朋友可以加我的微信ghostcloud2016,然后我把你加到我们的一个Docker爱好者群组里面.) 到目前为止,我们已经学习了docker的基本用法,包括拉取镜像,运行容器,编译镜像文件等等.接下来,我们将学习如何通过docker hub来简化你的操作,并提高你的工作效率. Docker Hub是Docker的主仓库,由Docker公司进行维护.这个仓库里面包含了系统的官方镜像,同时提供简单的用户认证信息,以及其他的附属功能.默认情况下

CentOS 7安装Docker服务详细过程_docker

Docker 简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何接口. Docker 官网:http://www.docker.com/ Docker 官方文档:https://docs.docker.com/ Docker Github 地址:https://github.com/docker/docker Docker 仓库:https:

linux中Docker指定网桥和指定网桥IP详解

$ docker network ls NETWORK ID          NAME                DRIVER 7fca4eb8c647        bridge              bridge 9f904ee27bf5        none                null cf03ee007fb4        host                host Bridge 默认bridge网络,我们可以使用docker network inspect

Docker 从入门到放弃(二)容器使用

Docker 容器使用 一.Docker 客户端 docker 客户端非常简单 ,我们可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项. root@iZ235mi4a64Z:~# docker Usage: docker COMMAND A self-sufficient runtime for containers Options: --config string Location of client config files (default "/root/.do

使用Docker搭建Java Web运行环境

一.Docker是干什么的 Docker 是一个基于Linux容器(LXC-linux container)的高级容器引擎,基于go语言开发, 源代码托管在 Github 上, 遵从Apache2.0协议开源.Docker的目标是实现轻量级的操作系统虚拟化解决方案. 学习Docker首先要了解几个概念: 镜像-Docker的镜像和常见的系统ISO镜像类似,包含了应用程序的信息: 容器-容器相当于一个可以运行起来的虚拟机,应用程序运行在容器中,Docker运行在"Docker"上: 仓库

Spring Boot与Docker(二):使用Spring Boot和Docker构建微服务架构

本文讲的是Spring Boot与Docker(二):使用Spring Boot和Docker构建微服务架构,[编者的话]本篇是<使用Spring Boot和Docker构建微服务架构>系列的第二篇,本篇我们将会利用工具进行设置,深入探讨如何使用Docker工作,然后搭建我们的第一个容器.原文作者为3Pillar环球旗下美国Adbanced技术集团的总监Dan Greene,Dan有十八年的软件设计和开发经验,包括在电子商务.B2B集成.空间分析.SOA架构.大数据以及云计算等领域的软件产品架