docker里的镜像绝大部分都是在别的镜像的基础上去进行建立的,也就是使用镜像的分层结构。docker
好比说使用dockerfile去建立一个最简单的hello镜像。建立好对应的dockerfile以后去进行建立:code
FROM alpine:latest MAINTAINER sbb CMD echo "hello world"
执行了上面的命令咱们能够看到存在着两个镜像,其中hello_world是我刚刚建立好的镜像。blog
$ docker imgaes alpine hello_world
那么为何会有两个镜像呢?这是因为docker的镜像分层结构所致使的,以下图所示。
资源
一个docker镜像由多个可读的镜像层组成,而后运行的容器会在这个docker的镜像上面多加一层可写的容器层,任何的对文件的更改都只存在此容器层。所以任何对容器的操做均不会影响到镜像。dockerfile
至于容器如何获取镜像层文件而又不影响到是镜像层的呢?docker是这样实现的?
若是须要获取某个文件,那么容器曾会从上到下去下一层的镜像层去获取文件,若是该层文件不存在,那么就会去下一镜像层去寻找,直到最后一层。
对于用户而言,用户面向的是一个叠加后的文件系统。io
而任何对于文件的操做都会记录在容器层,例如说修改文件,容器层会把在镜像层找到的文件拷贝到容器层而后进行修改,删除文件则会在容器层内记录删除文件的记录。test
可能会有人会文为何要这么去作呢?我以为有两大好处:容器
这个好处也是最大好处,就是能够共享资源,其余相同环境的软件镜像都共同去享用同一个环境镜像,而不须要每一个软件镜像要去建立一个底层环境。基础