
Scratch镜像小巧而且快速, 没有bug、安全漏洞、延缓的代码或者技术债务。由于它几乎是一个空的镜像。一般来说,你要追求极致小巧的docker镜像,那么你需要从scratch镜像一步步的创立你所需要的服务。
而我们常见的centos镜像,ubuntu镜像都是在最基础的镜像之上再做封装,将少量linux系统相关的特性服务增加到基础镜像之上生成的新镜像。
既然镜像都是从最初的基础镜像上一步步封装而成的,那么这样镜像会不会由于屡次封装而变的很大。其实并不会,docker镜像中,有多个镜像层,这些镜像层一台物理机器上可以共使用。例如你有基于centos镜像的nodejs镜像、mysql镜像、redis镜像。 其实这些镜像都公使用了底层的centos镜像层,所以真实存储的镜像大小只有底层的centos镜像层和nodejs服务镜像层、mysql服务镜像层、redis服务镜像层。
基于节约了空间资源的思路,docker的镜像采使用分层结构,所以我们见到的docker镜像都是一层层叠加起来的镜像。
前面已经详情了docker镜像采使用分层结构,那么在实际运使用中容器是如何和镜像进行协作的呢?
我们指定启动容器是将docker镜像重新激活并持续运行,那么我们在容器中进行改动时,镜像也会随之改动吗?答案是,镜像是不可改动的,例如我们对容器中某个文件进行删除,不是删除镜像层中的文件而是在容器自己所运行的层中进行标记,告诉容器自己这个文件已经删除。修改略微复杂一点,需要从镜像层中拷贝这个文件到容器层,在容器层进行修改并标记以后这个文件从容器层里查看。
那么现在大家应该很清楚,启动容器之后,所有的操作其实都记录在该容器层上,那么将此容器保存时操作的越多,那么容器层形成的新的镜像层会越大。这也就是我们使用dockerfile生成镜像的时候,尽可能的将更多的任务在一个RUN中执行,毕竟每一个RUN都会形成一个镜像层。
最上方就是我们前面说到的容器层是可以读写的层,
1,2,3是三个镜像层,最下面的1镜像层一般是操作系统镜像层,例如centos镜像层。

