文档章节

镜像的缓存特性 - 每天5分钟玩转 Docker 容器技术(14)

CloudMAN
 CloudMAN
发布于 2017/05/12 06:53
字数 628
阅读 485
收藏 1

#程序员薪资揭榜#你做程序员几年了?月薪多少?发量还在么?>>>

上一节我们学习了镜像的分层结构,今天讨论镜像的缓存特性。
 

Docker 会缓存已有镜像的镜像层,构建新镜像时,如果某镜像层已经存在,就直接使用,无需重新创建。

举例说明。
在前面的 Dockerfile 中添加一点新内容,往镜像中复制一个文件:

73.png

root@ubuntu:~# ls           ①

Dockerfile  testfile

root@ubuntu:~#

root@ubuntu:~# docker build -t ubuntu-with-vi-dockerfile-2 .

Sending build context to Docker daemon 32.77 kB

Step 1 : FROM ubuntu

 ---> f753707788c5

Step 2 : RUN apt-get update && apt-get install -y vim

 ---> Using cache         ②

 ---> 35ca89798937

Step 3 : COPY testfile /          ③

 ---> 8d02784a78f4

Removing intermediate container bf2b4040f4e9

Successfully built 8d02784a78f4


① 确保 testfile 已存在。

② 重点在这里:之前已经运行过相同的 RUN 指令,这次直接使用缓存中的镜像层 35ca89798937。

③ 执行 COPY 指令。
其过程是启动临时容器,复制 testfile,提交新的镜像层 8d02784a78f4,删除临时容器。

在 ubuntu-with-vi-dockerfile 镜像上直接添加一层就得到了新的镜像 ubuntu-with-vi-dockerfile-2。

如果我们希望在构建镜像时不使用缓存,可以在 docker build 命令中加上 --no-cache 参数。

Dockerfile 中每一个指令都会创建一个镜像层,上层是依赖于下层的。无论什么时候,只要某一层发生变化,其上面所有层的缓存都会失效。

也就是说,如果我们改变 Dockerfile 指令的执行顺序,或者修改或添加指令,都会使缓存失效。

举例说明,比如交换前面 RUN 和 COPY 的顺序:

虽然在逻辑上这种改动对镜像的内容没有影响,但由于分层的结构特性,Docker 必须重建受影响的镜像层。

root@ubuntu:~# docker build -t ubuntu-with-vi-dockerfile-3 .

Sending build context to Docker daemon 37.89 kB

Step 1 : FROM ubuntu

 ---> f753707788c5

Step 2 : COPY testfile /

 ---> bc87c9710f40

Removing intermediate container 04ff324d6af5

Step 3 : RUN apt-get update && apt-get install -y vim

 ---> Running in 7f0fcb5ee373

Get:1 http://archive.ubuntu.com/ubuntu xenial InRelease [247 kB]

......


从上面的输出可以看到生成了新的镜像层 bc87c9710f40,缓存已经失效。

除了构建时使用缓存,Docker 在下载镜像时也会使用。例如我们下载 httpd 镜像。

docker pull 命令输出显示第一层(base 镜像)已经存在,不需要下载。

由 Dockerfile 可知 httpd 的 base 镜像为 debian,正好之前已经下载过 debian 镜像,所以有缓存可用。通过 docker history 可以进一步验证。

下一节我们学习如何调试 Dockerfile。

二维码+指纹.png

© 著作权归作者所有

CloudMAN
粉丝 541
博文 360
码字总数 221704
作品 0
海淀
私信 提问
加载中

评论(0)

预告 — 容器平台技术

容器我们已经学了大半年,先回顾一下容器生态系统: 容器生态系统包含三个部分: 容器核心知识,包括架构、镜像、容器、网络和存储。 容器平台技术,包括容器编排引擎、容器管理平台和基于容...

CloudMan6
2017/11/15
0
0
用 k8s 管理机密信息 - 每天5分钟玩转 Docker 容器技术(155)

应用启动过程中可能需要一些敏感信息,比如访问数据库的用户名密码或者秘钥。将这些信息直接保存在容器镜像中显然不妥,Kubernetes 提供的解决方案是 Secret。 Secret 会以密文的方式存储数据...

cloudman6
2018/04/15
0
0
运行第一个 Service - 每天5分钟玩转 Docker 容器技术(96)

上一节我们创建好了 Swarm 集群, 现在部署一个运行 httpd 镜像的 service,执行如下命令: docker service create --name web_server httpd 部署 service 的命令形式与运行容器的 很相似, ...

CloudMan6
2017/11/22
0
0
每天5分钟玩转Docker容器技术(四)

每天5分钟玩转Docker容器技术(一) 每天5分钟玩转Docker容器技术(二) 每天5分钟玩转Docker容器技术(三) 镜像的缓存特性 Docker 会缓存已有镜像的镜像层,构建新镜像时,如果某镜像层已经...

阿里云云栖社区
2018/01/04
0
0
17、《每天5分钟玩转Docker容器技术》学习--Multi-host网络

------------------------------------重要说明------------------------------------ 本文内容都是参考Cloudman系列进行学习,是个人学习过程记录,与原版不同! 原版请参考cloudman《每天5...

hostman6
2018/04/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

money.

时间就是金钱,效率就是生命。美轮美奂,并不能填饱肚子,假如你的老师没有告诉你这个道理,那他就不是合格的老师。 你可以反复构思一年,然后用1000行代码替代大妈的10000行,没错,我认为有...

MtrS
昨天
17
0
2020.05.28 数据库连接池 C3P0 Druid JDBCTemplate

今日内容 1. 数据库连接池2. Spring JDBC : JDBC Template 数据库连接池 1. 概念:其实就是一个容器(集合),存放数据库连接的容器。 当系统初始化好后,容器被创建,容器中会申请一些...

HUBEIHUA
昨天
15
0
如果我有jQuery背景,那么“ AngularJS中的思考”吗? [关闭]

问题: Closed . 已关闭 。 This question needs to be more focused . 这个问题需要更加集中 。 It is not currently accepting answers. 它当前不接受答案。 Want to improve this questio......

技术盛宴
昨天
9
0
ArrayList-不常用方法

这篇笔记主要记录一些不常用方法,了解一下可以干什么,有个印象。 改变数组容量 /** * 将该<tt> ArrayList </ tt>实例的容量调整为列表的当前大小。 * 应用程序可以使用此操作来最大程度...

jackdawl
昨天
4
0
PCDN+路由器就能赚钱? 揭秘京东云无线宝背后的黑科技

受疫情影响,今年视频直播、点播等在线视频业务迎来了爆发期,看视频成为人们宅在家中的主要消遣方式之一,由此带来的互联网流量增长大幅增加了对 CDN流量的消耗。传统CDN依赖于运营商、IDC...

京东智联云开发者
昨天
30
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部