docker镜像分层结构
用过Dockerfile构建镜像的都知道Dockerfile执行完每一条指令都会创建一个新的镜像,最终的镜像由层层叠加而成。
分层的好处
最大的好处就是共享资源。
当多个镜像从相同的base镜像构建而来,那么Docker host只需要在磁盘保存一份base镜像,同时内存中也只需要加载一份base镜像,就可以为所有的容器服务了。
容器的修改并不会影响镜像
当容器启动时,一个新的可写层被加载到镜像的顶层,这一层通常被成为“容器层”。
对容器的改动,无论添加、删除、还是修改文件都只会发生在容器层中。
容器层是可写的,镜像层是只读的。
- 添加文件时,新的文件添加到容器层。
- 读取文件时,从上往下在各个镜像层查找,一旦找到就复制到容器层,然后读入内存。
- 修改文件,从上往下查找,复制到容器层,然后修改之。
- 删除文件,从上往下查找,找到后返回,记录删除操作。
只有当需要修改时才赋值一份数据,这种特性被称为Copy-On-Write。
容器层保存的是镜像层的变化,但不会对镜像本身进行任何修改。这也解释了镜像可以被多个容器共享。