docker的镜像分层

docker里的镜像绝大部分都是在别的镜像的基础上去进行创建的,也就是使用镜像的分层结构。

实验

比如说使用dockerfile去创建一个最简单的hello镜像。创建好对应的dockerfile之后去进行创建:

FROM alpine:latest
MAINTAINER sbb
CMD echo "hello world"

执行了上面的命令我们可以看到存在着两个镜像,其中hello_world是我刚刚创建好的镜像。

$ docker imgaes
alpine
hello_world

docker分层

那么为什么会有两个镜像呢?这是由于docker的镜像分层结构所导致的,如下图所示。

一个docker镜像由多个可读的镜像层组成,然后运行的容器会在这个docker的镜像上面多加一层可写的容器层,任何的对文件的更改都只存在此容器层。因此任何对容器的操作均不会影响到镜像。

如何实现

至于容器如何获取镜像层文件而又不影响到是镜像层的呢?docker是这样实现的?
如果需要获取某个文件,那么容器曾会从上到下去下一层的镜像层去获取文件,如果该层文件不存在,那么就会去下一镜像层去寻找,直到最后一层。
对于用户而言,用户面向的是一个叠加后的文件系统。

而任何对于文件的操作都会记录在容器层,例如说修改文件,容器层会把在镜像层找到的文件拷贝到容器层然后进行修改,删除文件则会在容器层内记录删除文件的记录。

综述

可能会有人会文为什么要这么去做呢?我觉得有两大好处:

    1. 基本上每个软件都是基于某个镜像去运行的,因此一旦某个底层环境出了问题,就不需要去修改全部基于该镜像的软件的镜像,只需要修改底层环境的镜像。
    2. 这个好处也是最大好处,就是可以共享资源,其他相同环境的软件镜像都共同去享用同一个环境镜像,而不需要每个软件镜像要去创建一个底层环境。

最新文章

  1. JavaScript 函数节流和函数去抖应用场景辨析
  2. windows和linux平台下的通用时间测试函数
  3. AC日记——最大数 洛谷 P1198 [JSOI2008]
  4. Web jquery表格组件 JQGrid 的使用 - 4.JQGrid参数、ColModel API、事件及方法
  5. JSP网站开发基础总结《一》
  6. Oracle 查询今天、昨日、本周、本月和本季度的所有记录
  7. linux service命令常见使用方法
  8. eclipse 左边目录结构下五referenced library解决办法
  9. git command
  10. *[codility]MissingInteger
  11. css - a:hover变色问题
  12. 设置TextView水平居中显示
  13. 产品 线上 保持 和 支持 服务 (Support and maintenance solutions)
  14. HDU 4793 2013 Changsha Regional Collision[简单的平面几何]
  15. poj 3070 Fibonacci 矩阵快速幂
  16. python基础--numpy.dot
  17. java 11 标准Java异步HTTP客户端
  18. jQuery效果------隐藏hide()/显示show()
  19. 关于ELK
  20. TXB0108 TXS0108E 8-Bit Bidirectional Voltage-Level Translator for Open-Drain and Push-Pull Applications

热门文章

  1. bzoj 2406 矩阵 —— 有源汇上下界可行流
  2. WPF中Xaml编译正常而Designer Time时出错的解决办法
  3. 采用MySQL_upgrade升级授权表方式升级
  4. Python:sample函数
  5. NET项目中分页方法
  6. WEB 项目中的全局异常处理
  7. cocos2dx之tolua++全面分析(二):类注册
  8. leetcode:234. Palindrome Linked List
  9. C++成员指针
  10. centos7命令行和图形界面的相互切换(附centos7安装配置教程)