赞
踩
类似面向对象技术中的继承特性,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镜像长什么样那?如下图展示了构建后的分层结构的镜像:
如上可知新镜像是在base镜像centos上一层一层叠加生成的。每安装一个软件,就会在已有的镜像的基础上增加一层。
docker镜像之所以采用分层结构,主要是为了实现资源共享。比如我一个host上可能要运行多个docker化的应用,比如同时运行交易应用和商品应用,并且假设这些应用都是基于同一个基础镜像扩展而来。则基于镜像的分层结构,这个host上其实只需要存在一份基础镜像即可,不同的应用共享该基础镜像,从而也可以节省磁盘空间。
镜像分层可以让不同应用共享基础镜像,但是我们知道基础镜像里面包含了用户态的文件系统,那么如果某个容器修改了文件系统中的文件,那么会不会对其他容器造成影响那?
其实是不会的,上面我们讲解的docker镜像的分层结构其实是docker镜像静态文件的结构(我们成为镜像层)。如下图:其实在容器运行时又在docker镜像的分层结构上加了一个容器层的概念,每个容器共享docker镜像的镜像层,但是每个容器都自己独立的容器层,当某个容器需要对镜像层内容进行修改时是采用写时拷贝的策略把文件复制到自己的容器层进行修改。所以镜像层是只读的,容器层是可修改额。镜像层是多容器共享的,容器层是每个容器独占的
戳下面阅读
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。