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