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  pythonfrom __future__ import print_functionimport requests
import jsonauth = 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上下载镜像配置文件。

Docker的Pull Digest和Image ID相关推荐

  1. 简单说下docker的pull 和 push

    pull:镜像的元信息与镜像层数据分开存储,当 pull 一个镜像时,先进行认证获取到 token 并授权通过, 然后获取镜像的 manifest 文件,进行 signature 校验.校验完成后,依 ...

  2. docker pull 下载一半_Docker 从入门到掉坑

    Docker 介绍 简单的对docker进行介绍,可以把它理解为一个应用程序执行的容器.但是docker本身和虚拟机还是有较为明显的出入的.我大致归纳了一下,可以总结为以下几点: docker自身也有 ...

  3. docker pull的镜像放在哪里_Docker 安装ELK及Docker常见命令

    最近搭建基于Spring Cloud的微服务框架,日志系统当然最佳选择就是ELK.看着MAC 那紧巴巴的配置,又不想热情退去而留下一堆软件,果断选择Docker安装来节省那可怜的资源.当然这只是鹏哥的 ...

  4. Docker “pull“命令获取镜像,讲道理你真的会吗?

    文章目录 docker pull 命令介绍 从Docker Hub拉取一个镜像 指定镜像tag标签拉取 查看已下载镜像列表 通过摘要拉取镜像 从其它注册中心拉取 docker pull 命令介绍 do ...

  5. VMWare 虚拟化 Ubuntu 64 (16.04)-- docker 无法链接 pull 镜像 ?(solved)

    背景 根据项目的需要,虚拟化一个Ubuntu OS 来玩 docker,虚拟机选择的是WMWare (VMware-player-14.0.0-6661328); Ubuntu的镜像来自于官网(ubu ...

  6. docker pull下载很慢_一文了解Docker容器技术的操作

    一文了解Docker容器技术的操作 前言 相信点进这篇文章的Coder,不管是在各大技术论坛上.技术交流群,亦或招聘网上,应该都有见到过Doker容器技术的面孔,随着社会节奏的加快以及迫于生活的压力, ...

  7. Docker安装Apache与运行简单的web服务——httpd helloworld

    Docker运行简单的web服务--httpd helloworld目录[阅读时间:约5分钟] 一.Docker简介 二.Docker的安装与配置[CentOS环境] 三.Docker运行简单的web ...

  8. 【Docker】Docker的三大核心组件

    镜像(Image).容器(Container).仓库(Repository)是我们常说的Docker的三大组件,接下来就让我们一起详细地探索一番吧. 一.镜像(Image) 什么是Docker镜像? ...

  9. Docker初学3:Docker的常用命令

    Docker的常用命令 帮助命令 帮助命令可以在我们遇到不懂的命令时帮助我们去了解它们怎么使用. docker version # 显示 Docker 版本信息. docker info # 显示 D ...

  10. Docker镜像使用

    当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载. 下面我们来学习: 1.管理和使用本地 Docker ...

最新文章

  1. 康威生命游戏是如何搭建计算机的?
  2. SD-WAN技术三大优势将成为SD-WAN方案成功的关键—Vecloud
  3. Blazor University (3)组件 — 创建组件
  4. 利用索引数组排序 不改变原数组值的位置
  5. 打卡小程序源码修复登录接口
  6. php swich w3c,JS Switch
  7. linux 内核学习线索初步
  8. 如何编辑PDF文件,教你几招轻松搞定
  9. Shell脚本编程之(二)简单的Shell脚本练习
  10. 操作系统 内存分配-分区
  11. 微信公众号模板如何使用?公众号模板教程!
  12. 安卓APP开发日记1——名为Another的日记APP开发
  13. 重新启动oracle 服务,在linux重新启动下如何设置oracle服务自动开启
  14. oracle 11g 新特性之动态绑定变量窥视(一)
  15. 点评阿里云盛大云代表的云计算IaaS产业---中国云计算
  16. 计算思维运用计算机的例子,计算思维案例及平时成绩讨论题资料.doc
  17. html网页的说课稿,网页设计之滚动字幕说课稿
  18. java商城毕业设计 JavaWeb家具家居购物商城毕业设计(10)下单结算
  19. js字母大小写转换方法
  20. 微积分小课堂:微积分的发明权之争【微积分发明和完善的过程】

热门文章

  1. 达梦(DM)数据库常见问题详解
  2. 解决Win10无操作两分钟进入睡眠问题
  3. 使用微信提供的云开发实现后端 微信小程序云开发的内容管理CMS
  4. WebClient发布到IIS后访问共享文件提示用户名或密码错误(已设置凭证)
  5. php 上传图片返回预览,图片上传前的预览(PHP)
  6. MATLAB打不开,选择licenses激活成功后还是要激活
  7. 如何对客户行为进行数据分析?
  8. axios delete
  9. mysql报错1194_MYSQL ERROR 1194 (HY000)
  10. Python的Scipy库解微分方程