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 history和docker 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和DigestPull分为两步,第一步是下载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上下载镜像配置文件。
Docker 镜像(image)& 容器(container) 什么是 Docker 镜像(image)? 镜像由多个层组成,每层叠加之后,从外部看来就如一个独立的对象; 镜像内部是一个精简的操作系统(OS),同时还包含应用运行所必须的文件和依赖包; 镜像可以运行一个或多个容器,同时镜像也可以停止某个容器的运行,并从中创建新的镜像;【镜像(iamge)的分类】...
太公 姜继忠,阿里云高级技术专家,负责阿里云容器服务和容器Hub等产品。目前关注容器相关技术。
相关文章
- Docker 容器中运行 Docker 命令
- centos7.4安装docker_docker安装python库
- 欢欣雀跃还是欢呼雀跃_极空间 docker
- docker安装elasticsearch单节点
- Docker容器网络(七)
- 「Docker学习系列教程」基础篇小总结及高级篇预告
- 【已解决】Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon runnin
- Docker服务的停止命令(systemctl stop docker)
- Docker启动容器命令(docker start 容器名称)
- Docker网络下-自定义网络实战
- 「 【Docker】设置docker加速器(如何使docker下载速度变快) 」
- redis cluster(集群)模式-基于docker 哈希槽分区
- dockercompose教程,docker-compose up
- 从 docker 到 runC
- docker 删除none 镜像详解程序员
- 探索Linux下的用户ID秘密(linux查看用户id)
- MySQL视图ID: 打开灵活的查询之门(mysql视图id)
- Linux下更改用户ID的技巧(linux更改用户id)
- 运用 Docker 部署 Redis 服务(dockerredis)
- Docker基础之二: Linux快速入门
- 如何运行容器?- 每天5分钟玩转 Docker 容器技术(22)
- 利用docker搭建gitlab代码仓库
- Red Hat 的去 Docker 化容器实践
- MSSQL生成唯一ID的实践探索(生成id mssql)
- MySQL中使用ID关联生成的方法(mysql中id关联生成)
- 查找Oracle数据库中的事务ID(oracle 事务id)
- Oracle ID清零激活新的账户(oracle id清零)
- 使用Redis实现自增ID的简单策略(redis自增id c)