Docker镜像的分层结构

06822b55170c1813bc8339afd7612f58.png

前言

类似面向对象技术中的继承特性,Docker允许我们基于现有镜像进行扩展,扩展出来的新镜像继承了原镜像里面的内容。

分层结构

在前面docker镜像里面究竟包含了什么东西一文中我们说过docker镜像里面包含了用户态的文件系统和开发者的应用相关的文件。其实用户态的文件系统rootfs是大多说应用都需要的,所以我们没必要在每个dockerfile里面都去添加它,我们可以把他放到基础镜像里面,然后所有应用只需要FROM这个基础镜像就可以了。

在docker中提供了镜像的分层结构,比如下面Dockfile文件:

FROM centos
RUN yum -y install wget
RUN yum -y install apache2
CMD ["bin/bash"]
  • 如上Dockerfile,FROM自centos基础镜像,centos里面只包含用户态的文件系统rootfs

  • 然后再centos的基础上安装了 wget软件,以及apache2软件

  • 最后容器启动时运行bash

那么上面Dockerfile构建出来的docker镜像长什么样那?如下图展示了构建后的分层结构的镜像:

79621e325019d4ff2c4c9f6685664a40.png

如上可知新镜像是在base镜像centos上一层一层叠加生成的。每安装一个软件,就会在已有的镜像的基础上增加一层。

分层的好处

docker镜像之所以采用分层结构,主要是为了实现资源共享。比如我一个host上可能要运行多个docker化的应用,比如同时运行交易应用和商品应用,并且假设这些应用都是基于同一个基础镜像扩展而来。则基于镜像的分层结构,这个host上其实只需要存在一份基础镜像即可,不同的应用共享该基础镜像,从而也可以节省磁盘空间。

镜像层与容器层

镜像分层可以让不同应用共享基础镜像,但是我们知道基础镜像里面包含了用户态的文件系统,那么如果某个容器修改了文件系统中的文件,那么会不会对其他容器造成影响那?

其实是不会的,上面我们讲解的docker镜像的分层结构其实是docker镜像静态文件的结构(我们成为镜像层)。如下图:其实在容器运行时又在docker镜像的分层结构上加了一个容器层的概念,每个容器共享docker镜像的镜像层,但是每个容器都自己独立的容器层,当某个容器需要对镜像层内容进行修改时是采用写时拷贝的策略把文件复制到自己的容器层进行修改。所以镜像层是只读的,容器层是可修改额。镜像层是多容器共享的,容器层是每个容器独占的

4195b62d27c78a34355ce59179d6a852.png
image.png

戳下面阅读

👇

我的第三本书    我的第二本书    我的第一本书

程序员的办公神器    ForkJoinPool    K8s网络模型

  我的视频号  

点亮再看哦👇

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值