当前位置:嗨网首页>书籍在线阅读

15-根据摘要拉取镜像

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

6.2.12 根据摘要拉取镜像

到目前为止,本书向读者介绍了如何通过标签来拉取镜像,这也是常见的方式。但问题是,标签是可变的!这意味着可能偶尔出现给镜像打错标签的情况,有时甚至会给新镜像打一个已经存在的标签。这些都可能导致问题!

假设镜像 golftrack:1.5 存在一个已知的Bug。因此可以拉取该镜像后修复它,并使用相同的标签将更新的镜像重新推送回仓库。

一起来思考下刚才发生了什么。镜像 golftrack:1.5 存在Bug,这个镜像已经应用于生产环境。如果创建一个新版本的镜像,并修复了这个Bug。那么问题来了,构建新镜像并将其推送回仓库时使用了与问题镜像相同的标签!原镜像被覆盖,但在生产环境中遗留了大量运行中的容器,没有什么好办法区分正在使用的镜像版本是修复前还是修复后的,因为两个镜像的标签是相同的!

是时候轮到镜像摘要(Image Digest)出马了。

Docker 1.10中引入了新的内容寻址存储模型。作为模型的一部分,每一个镜像现在都有一个基于其内容的密码散列值。为了讨论方便,本书用摘要代指这个散列值。因为摘要是镜像内容的一个散列值,所以镜像内容的变更一定会导致散列值的改变。这意味着摘要是不可变的。这种方式可以解决前面讨论的问题。

每次拉取镜像,摘要都会作为 docker image pull 命令返回代码的一部分。只需要在 docker image ls命 令之后添加 --digests 参数即可在本地查看镜像摘要。接下来的示例中也会进行相关演示。

$ docker image pull alpine
Using default tag: latest
latest: Pulling from library/alpine
e110a4a17941: Pull complete
Digest: sha256:3dcdb92d7432d56604d...6d99b889d0626de158f73a
Status: Downloaded newer image for alpine:latest
$ docker image ls --digests alpine
REPOSITORY  TAG     DIGEST              IMAGE ID      CREATED        SIZE
alpine      latest  sha256:3dcd...f73a  4e38e38c8ce0  10 weeks ago   4.8 MB

从上面的代码片段中可知,Alpine镜像的签名值如下。

sha256:3dcdb92d7432d56604d... 6d99b889d0626de158f73a

现在已知镜像的摘要,那么可以使用摘要值再次拉取这个镜像。这种方式可以确保 准确拉取想要的镜像

在撰写本书时,已经没有原生Docker命令支持从远端镜像仓库服务(如Docker Hub)中获取镜像签名了。这意味着只能先通过标签方式拉取镜像到本地,然后自己维护镜像的摘要列表。镜像摘要在未来绝对不会发生变化。

下面的例子首先在Docker主机上删除 alpine:latest 镜像,然后显示如何通过摘要(而不是标签)来再次拉取该镜像。

$ docker image rm alpine:latest
Untagged: alpine:latest
Untagged: alpine@sha256:c0537...7c0a7726c88e2bb7584dc96
Deleted: sha256:02674b9cb179d...abff0c2bf5ceca5bad72cd9
Deleted: sha256:e154057080f40...3823bab1be5b86926c6f860
$ docker image pull alpine@sha256:c0537...7c0a7726c88e2bb7584dc96
sha256:c0537...7726c88e2bb7584dc96: Pulling from library/alpine
cfc728c1c558: Pull complete
Digest: sha256:c0537ff6a5218...7c0a7726c88e2bb7584dc96
Status: Downloaded newer image for alpine@sha256:c0537...bb7584dc96