Docker镜像大小

都说容器大法好,可是假设没有Docker镜像,Docker该是多无趣啊。

是否还记得第一个接触Docker的时候,你从Docker Hub下拉的那个镜像呢?在那个处女镜像的基础上。你执行了容器生涯的处女容器。镜像的基石作用已经非常明显。在Docker的世界里,能够说是:No Image,No Container。

再进一步思考Docker镜像,大家可能非常快就会联想到下面几类镜像:

  • 1.系统级镜像:如Ubuntu镜像。CentOS镜像以及Debian容器等;

    2.工具栈镜像:如Golang镜像。Flask镜像,Tomcat镜像等;

    3.服务级镜像:如MySQL镜像,MongoDB镜像。RabbitMQ镜像等;

    4.应用级镜像:如WordPress镜像,DockerRegistry镜像等。

镜像林林总总。想要执行Docker容器。必须要有Docker镜像;想要有Docker镜像,必须要先下载Docker镜像。既然涉及到下载Docker镜像,自然会存在Docker镜像存储。谈到Docker镜像存储,那我们首先来聊聊Docker镜像大小方面的知识。

下面将从三个角度来分析Docker镜像的大小问题:Dockerfile与镜像、联合文件系统以及镜像共享关系。

Dockerfile与镜像
Dockerfile由多条指令构成,随着深入研究Dockerfile与镜像的关系,非常快大家就会发现。Dockerfile中的每一条指令都会相应于Docker镜像中的一层。

继续以例如以下Dockerfile为例:
在这里插入图片描述

FROM ubuntu:14.04
ADD run.sh /
VOLUME /data
CMD ["./run.sh"]

通过docker build以上Dockerfile的时候。会在Ubuntu:14.04镜像基础上,加入三层独立的镜像,依次相应于三条不同的命令。

镜像示意图例如以下:

镜像

有了Dockerfile与镜像关系的初步认识之后,我们再进一步联系到每一层镜像的大小。

不得不说,在层级化管理的Docker镜像中。有不少层大小都为0。

那些镜像层大小不为0的情况,归根结底的原因是:构建Docker镜像时,对当前的文件系统造成了改动更新。

而改动更新的情况主要有两种:

1.ADD或COPY命令:ADD或者COPY的作用是在docker build构建镜像时向容器中加入内容。仅仅要内容加入成功,当前构建的那层镜像就是加入内容的大小,如以上命令ADD run.sh /。新构建的那层镜像大小为文件run.sh的大小。

2.RUN命令:RUN命令的作用是在当前空的镜像层内执行一条命令,倘若执行的命令须要更新磁盘文件。那么全部的更新内容都在存储在当前镜像层中。

举例说明:RUN echo DaoCloud命令不涉及文件系统内容的改动,故命令执行完之后当前镜像层的大小为0;RUN wget http://abc.com/def.tar命令会将压缩包下载至当前文件夹下,因此当前这一层镜像的大小为:对文件系统内容的增量改动部分,即def.tar文件的大小。

联合文件系统
Dockerfile中命令与镜像层一一相应。那么是否意味着docker build完成之后。镜像的总大小=每一层镜像的大小总和呢?答案是肯定的。

依旧以上图为例:假设ubuntu:14.04镜像的大小为200MB,而run.sh的大小为5MB,那么以上三层镜像从上到下,每层大小依次为0、0以及5MB,那么终于构建出的镜像大小的确为0+0+5+200=205MB。

尽管终于镜像的大小是每层镜像的累加,可是须要额外注意的是:Docker镜像的大小并不等于容器中文件系统内容的大小(不包含挂载文件,/proc、/sys等虚拟文件)。个中缘由,就和联合文件系统有非常大的关系了。

首先来看一下这个简单的Dockerfile样例(假如在Dockerfile当前文件夹下有一个100MB的压缩文件compressed.tar):

FROM ubuntu:14.04
ADD compressed.tar /
RUN rm /compressed.tar
ADD compressed.tar /

1.FROM ubuntu:镜像ubuntu:14.04的大小为200MB;

2.ADD compressed.tar /: compressed.tar文件为100MB,因此当前镜像层的大小为100MB,镜像总大小为300MB。

3.RUN rm /compressed.tar:删除文件compressed.tar,此时的删除并不会删除下一层的compressed.tar文件。仅仅会在当前层产生一个compressed.tar的删除标记,确保通过该层将看不到compressed.tar,因此当前镜像层的大小也为0。镜像总大小为300MB。

4.ADD compressed.tar /:compressed.tar文件为100MB,因此当前镜像层的大小为300MB+100MB。镜像总大小为400MB。

分析完成之后,我们发现镜像的总大小为400MB。可是假设执行该镜像的话,我们非常快能够发如今容器根文件夹下执行du -sh之后。显示的数值并不是400MB,而是300MB左右。基本的原因还是:联合文件系统的性质保证了两个拥有compressed.tar文件的镜像层,仅仅会容器看到一个。同一时候这也说明了一个现状,当用户基于一个非常大,甚至好几个GB的镜像执行容器时。在容器内部查看根文件夹大小,发现居然仅仅有500MB不到,设置更小。

分析至此,有一点大家须要非常注意:镜像大小和容器大小有着本质的差别。

镜像共享关系
Docker镜像说大不大,说小不小。可是一旦镜像的总数上来之后,岂不是对本地磁盘造成非常大的存储压力?平均每一个镜像500MB,岂不是100个镜像就须要准备50GB的存储空间?

结果往往不是我们想象的那样,Docker在镜像复用方面设计得非常出色,大大节省镜像占用的磁盘空间。

Docker镜像的复用主要体如今:多个不同的Docker镜像能够共享同样的镜像层。

假设本地镜像存储中仅仅有一个ubuntu:14.04的镜像。我们以两个Dockerfile来说明镜像复用:

FROM ubuntu:14.04
RUN apt-get update
FROM ubuntu:14.04
ADD compressed.tar /

假设终于docker build构建出来的镜像名分别为image1和image2。因为两个Dockerfile均基于ubuntu:14.04。因此。image1和image2这两个镜像均复用了镜像ubuntu:14.04。

假设RUN apt-get update改动的文件系统内容为20MB,终于本地三个镜像的大小关系应该例如以下:

ubuntu:14.04: 200MB

image1:200MB(ubuntu:14.04)+20MB=220MB

image2:200MB(ubuntu:14.04)+100MB=300MB

假设仅仅是单纯的累加三个镜像的大小,那结果应该是:200+220+300=720MB,可是因为镜像复用的存在,实际占用的磁盘空间大小是:200+20+100=320MB,足足节省了400MB的磁盘空间。在此,足以证明镜像复用的巨大优点。

总结
学习Docker的同一时候,往往有三部分内容是分不开的,那就是Dockerfile。Docker镜像与Docker容器,分析Docker镜像大小也是如此。Docker镜像的大小,貌似平淡无奇,却是优化镜像,容器磁盘限额必须要涉及的内容。

本系列将通过下面多篇文章来分析Docker镜像:

1.深刻理解 Docker 镜像大小

2.事实上 docker commit 非常easy

3.不得不说的 docker save 与 docker export 差别

4.为什么有些容器文件动不得

5.打破 MNT Namespace 的容器 VOLUME

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/479286.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文浅尝 | 机器阅读理解中常识知识的显式利用

论文笔记整理:吴林娟,天津大学硕士,自然语言处理方向。链接:https://arxiv.org/pdf/1809.03449.pdf动机机器阅读理解(MRC)和人类进行阅读理解之间还存在差距,作者认为主要体现在对于数据的需求和噪声鲁棒性上&#xff…

深度学习在美团配送ETA预估中的探索与实践

1.背景 ETA(Estimated Time of Arrival,“预计送达时间”),即用户下单后,配送人员在多长时间内将外卖送达到用户手中。送达时间预测的结果,将会以”预计送达时间”的形式,展现在用户的客户端页面…

在AndroidStudio中配置Gradle进行 “动态编译期间,根据远程服务器地址 ,生成多类安装包”

原文地址:http://www.cnblogs.com/vir56k/p/4763810.html 需求: 在产品开发中,经常需要发布各个版本,每个版本的服务器地址有不同的服务器地址。比如 开发 服务器使用 192.168.1.232服务器,测试 服务器使用 192.168.1.…

中科院博士整理的机器学习算法知识手册,完整 PDF 开放下载!

分享一份中科院博士总结的机器学习算法知识手册,文章已打包成压缩文件,感兴趣的同学可下载交流。文件包含了:机器学习基础,监督学习方法、非监督学习方法,Python数据科学和深度学习等相关知识,若初学者在自…

论文浅尝 | 通过共享表示和结构化预测进行事件和事件时序关系的联合抽取

论文笔记整理:邓淑敏,浙江大学在读博士,研究方向为低资源条件下知识图谱自动化构建关键技术研究。Rujun Han, Qiang Ning, Nanyun Peng. Joint Event and Temporal Relation Extractionwith Shared Representations and Structured Predictio…

研发团队资源成本优化实践

背景 工程师主要面对的是技术挑战,更关注技术层面的目标。研发团队的管理者则会把实现项目成果和业务需求作为核心目标。实际项目中,研发团队所需资源(比如物理机器、内存、硬盘、网络带宽等)的成本,很容易被忽略&…

抖音算法推荐机制详解(科普向)

本文转载自公众号“夕小瑶的卖萌屋”,专业带逛互联网算法圈的神操作 -----》我是传送门 关注后,回复以下口令: 回复【789】 :领取深度学习全栈手册(含NLP、CV海量综述、必刷论文解读) 回复【入群】&#xf…

论文浅尝 | 融合多粒度信息和外部语言知识的中文关系抽取

论文笔记整理:吴涵,天津大学硕士,研究方向:自然语言处理Paper:https://www.aclweb.org/anthology/P19-1430/Code:https://github.com/thunlp/Chinese_NRE引入中文NER问题在很大程度上取决于分词的效果,所以在中文NER问…

智能写作

6.2万字报告剖析「智能写作」全貌,从落地产品看NLP商业化突破:

论文拒稿的评价可以有多狠?

文 | 自然卷知乎自古严师出高徒,“天将降大任于是人也,必先苦其心志,劳其筋骨……”。然而,这并不能作为审稿人走向“键盘侠”之路的理由!让我们这些卑微投稿人心里真是好凉凉!ಥ_ಥ 大家来看看&#xff0c…

全链路压测自动化实践

背景与意义 境内度假是一个低频、与节假日典型相关的业务,流量在节假日较平日会上涨五到十几倍,会给生产系统带来非常大的风险。因此,在2018年春节前,我们把整个境内度假业务接入了全链路压测,来系统性地评估容量和发现…

论文浅尝 | GMNN: Graph Markov Neural Networks

论文笔记整理:吴锐,东南大学硕士研究生,研究方向为自然语言处理来源:ICML 2019链接:http://proceedings.mlr.press/v97/qu19a/qu19a.pdf问题定义弱监督下的在关系数据中的对象分类。形式化地来说,给定一个图…

五笔字根表口诀的通俗易懂讲解

五笔字根表口诀的通俗易懂讲解 从上面五笔学习导图,我们不难看出,五笔只包含两个部分,一是独立字。二是字根字。 1 先来讲解独立字。 独立字就是不用字根就可以输出的汉字,独立字包含一级简码,按键字两种。…

论文浅尝 | 基于知识图谱难度可控的多跳问题生成

论文笔记整理:谭亦鸣,东南大学博士生,研究兴趣:知识图谱问答。来源:ISWC 2019链接:https://link.springer.com/content/pdf/10.1007%2F978-3-030-30793-6_22.pdf本文提出一个end2end神经网络模型以知识图谱…

LeetCode 933. 最近的请求次数(queue)

1. 题目 写一个 RecentCounter 类来计算最近的请求。 它只有一个方法:ping(int t),其中 t 代表以毫秒为单位的某个时间。 返回从 3000 毫秒前到现在的 ping 数。 任何处于 [t - 3000, t] 时间范围之内的 ping 都将会被计算在内,包括当前&…

如何融合深度学习特征向量?

本文转载自公众号“夕小瑶的卖萌屋”,专业带逛互联网算法圈的神操作 -----》我是传送门 关注后,回复以下口令: 回复【789】 :领取深度学习全栈手册(含NLP、CV海量综述、必刷论文解读) 回复【入群】&#xf…

将军令:数据安全平台建设实践

背景 在大数据时代,数据已经成为公司的核心竞争力。此前,我们介绍了美团酒旅起源数据治理平台的建设与实践,主要是通过各种数据分析挖掘手段,为公司发展决策和业务开展提供数据支持。 近期,业内数据安全事件频发&#…

Android官方开发文档Training系列课程中文版:与其它APP交互之将用户带到其它的APP

原文地址:http://android.xsoftlab.net/training/basics/intents/index.html 导言 一个Android APP应用通常会有若干个Activity。每一个Activity所展示的用户界面用于允许用户执行特定的任务(比如浏览地图或者是拍照)。为了把用户从一个activity带到另一个activit…

开源开放 | 图数据交互可视化分析框架 InteractiveGraph v0.3 版本发布

图数据交互可视化分析框架 InteractiveGraph 日前发布 v0.3 版本,下载地址:https://github.com/grapheco/InteractiveGraph/releases/tag/0.3.1图数据模型具有对实体关系的表达能力强、属性 及结构可扩展性好、关联查询高效等优势。在对海量 的多元异构信…

LeetCode 589. N叉树的前序遍历(前序遍历)

文章目录1. 题目2. 解题2.1 递归2.2 循环1. 题目 2. 解题 2.1 递归 class Solution { public:vector<int> preorder(Node* root) {vector<int> ans;preRec(root,ans);return ans;}void preRec(Node* root, vector<int> &ans) {if(root NULL)return;ans…