前言


我们在使用Docker下载镜像时,有时候看起来几百兆的镜像,然而只需要几秒钟就可以下载了,而且我们回头看硬盘空间里,却没有占用多大的空间。这是由于Docker的复用性。


本文就着力解释这个现象,即Docker利用“层”来解决复用性的问题。

 

利用“层”解决复用性问题


Docker镜像使用了一种技术:UnionFS和一个全新的概念:层(layer),优化每个镜像的磁盘空间占用,提高镜像的复用性。

 

首先,我们简单地看看UnionFS是什么。UnionFS是一个联合挂载的功能,它可以将多个路径下的文件联合挂载到同一个目录下。拿“栗子”来说,现在有一个目录结构:


image.png 


(使用tree命令,查看包含A和B两个文件夹)


A目录下有a和x两个文件,B目录下有b和x两个文件,通过UnionFS的功能,我们可以将这两个目录挂载到C目录下,效果如下图所示:


mount-taufs-odirs=./a:./bnone./C


 image.png


(使用tree命令查看联合挂载的效果)

 

最终C目录下的x只有一份,并且如果我们对C目录下的a、b、x修改,之前目录A和B中的文件同样会被修改。而Docker正是用了这个技术,对其镜像内的文件进行了联合挂载,比如可以分别把/sys,/etc,/tmp目录一起挂载到rootfs中形成一个在子进程,这看起来就是一个完整的rootfs,但没有占用额外的磁盘空间。


基于这一点,Docker还自主创新了层的概念。第一,它将系统内核所需的rootfs内的文件挂载到一个“只读层”中,把用户应用程序、系统配置文件等之类可以修改的文件挂载到“可读写层”中。我们也可以在容器引导时将初始化参数安装到一个专门的"可读写层"中。在容器启动时,我们还可以将初始化参数挂载到了专门的“init层”中。容器启动的最后阶段,这三层再次被联合挂载,最终形成了容器中的rootfs。


image.png 

Docker的只读层、可读写层和init层)


从上面的描述中,我们可以了解到只读层最适合放置的是固定版本的文件,代码几乎不会改变,才能实现最大的复用。比如活字格公有云是基于.netcore开发的,我们将其用到的基础环境等都会设计在了只读层,每次获取最新镜像时,因为每一份只读层都是完全一样的,所以完全不用下载。

 

Docker的“层”解释了为什么Docker镜像只在第一次下载时速度较快,而且镜像速度较快,而且明明每一张镜像看起来都有几百兆,但最终机器上的硬盘缺并没有占用这么多的原因。较小的磁盘空间,更快的加载速度,使Docker的复用性得到了极大的提高。

 

结尾


本文主要讲了Docker如何利用“层”这个概念来解决复用性的问题,从而使得明明几百兆的镜像看起来却只需要一点空间就可以,从而达到Docker的复用性。

相关资讯
  • DevOps成熟的阶段是什么? 2021-08-19 程序员-bluelulu

    DevOps是一种文化、运动或惯例,重视软件开发人员(Dev)和IT运维技术人员(Ops)之间的沟通与合作。它的出现是因为软件行业越来越清楚地认识到,为了按时交付软件产品和服务,开发和运营必须密切合作。接下来,我们...查看全文>>

  • Kubernetes持久卷的类型 2021-08-20 程序员-bluelulu

    在前面的文章里,我们了解了如何使用Volume持久数据和状态,接下来的文章里,我们来看看Kubernetes持久卷的类型有哪些? Kubernetes卷可根据其生命周期和配置方式进行分类。 考虑到试卷的生命周期,我...查看全文>>

  • 使用Pod处理紧密关系 2021-08-15 编程cr

    Pod是Kubernetes所创新的一个概念,其原型是Borg中的Alloc,是Kubernetes运行应用的最小执行单元,由一个或者多个紧密协作的容器组合而成,其出现的原因是针对容器的一个致命性弱点——单一进程这问题的扩展,让...查看全文>>

  • DevOps介绍 2021-07-12 程序员_苗

    前言:DevOps是朝向IT经营的详细工作流引擎,根据IT自动化技术、持续集成(CI)、不断布署(CD),提升软件开发、检测、系统软件经营等各个阶段。本篇跟大家一起来介绍什么是DevOps。什么叫DevOps?Devops(Developmen...查看全文>>

  • DevOps解决了哪些挑战? 2021-08-19 程序员-bluelulu

    DevOps是敏捷软件开发的产物,,是敏捷软件开发为了跟上软件开发速度和实现吞吐量而产生的,接下来我们就来介绍一下DevOps的目标是什么?DevOps解决了哪些挑战? DevOps的目标是什么?改进所有参与者之间的...查看全文>>

  • K8S持久卷能解决哪些问题? 2021-08-20 程序员-bluelulu

    在之前的文章中,我们简要介绍了持久卷(PersistentVolumes),本文将学习Kubernetes持久卷能解决哪些问题? 前期准备:请确保Docker安装在开始本教程之前。Kubectl同时安装。 Kubernetes持久卷能解决哪些...查看全文>>

在线
客服
APP
下载

下载Android客户端

下载iphone 客户端

官方
微信

关注官方微信

返回
顶部