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. python之路十六
  2. Win32中TreeView控件的使用方法,类似于资源管理器中文件树形显示方式
  3. ECLIPSE ANDROID PROJECT IMPORT SUMMARY
  4. django models数据类型
  5. [51NOD1007] 正整数分组(DP,记忆化搜索)
  6. grunt 快速入门
  7. 安装cocoaPods遇到的坑
  8. HDU 4283 You Are the One
  9. JavaScript 面向对象(一)
  10. TCP协议之三次握手与四次挥手
  11. java生成首字母拼音简码的总结
  12. 69、django之Form组件
  13. Linux下文件权限(一)用户ID和用户组ID
  14. STL:STL各种容器的使用时机详解
  15. 【堆】【洛谷例题】p1090 p1334 p1177
  16. 一种表达式语言的解析引擎JEXL简单使用
  17. 洛谷 P1053 音乐会的等待 解题报告
  18. 第16月第15天 glut
  19. DBWritable的使用
  20. Linux 操作系统下,安装软件 apt-get、yum 的区别

热门文章

  1. POJ 2888 Magic Bracelet [Polya 矩阵乘法]
  2. POJ置换群入门[3/3]
  3. .NET方面的框架的整理和总结
  4. IBM优质资源
  5. python学习:hashlib模块使用
  6. word设置每页50行
  7. backgroud背景色样式兼容ie8 rgba()用法
  8. ASP.NET Core的身份认证框架IdentityServer4--(3)令牌服务配置访问控制跟UI添加
  9. hql语句中的select字句和from 字句
  10. Yii小部件