1. 写时复制原理
写时复制技术是Docker 容器中非常核心的一个功能,Docker 容器运行后,当我们需要去修改一个不在最顶层分支中的文件时,这个时候最顶层的分支需要先将需要修改的文件从其所在的层拷贝到最顶层的分支,然后再对拷贝上上来的文件进行修改,文件修改完成后位于底层分支的文件内容并未发生改变,这种方式就是写时复制技术,也称COW。
当我们在最上层的分支中去删除从底层分支拷贝上来的文件时,此时文件文件并没有被实际删除,只是在最顶层的分支中对被删文件进行了重命名和隐藏的操作,因此被执行删除操作的文件实际并没有被删除,只是不可见了。
如下图所示,我们看到的文件file1 其实是镜像层中branch0分支中的文件:
当我们需要修改文件file1时,Device Mapper 中的写时复制技术会将文件file1直接拷贝到最上层的top branch,然后再进行修改,即我们修改的其实是从底层拷贝的文件:
当我们需要删除文件file1时,由于文件file1是镜像层的文件,此时会在容器最上层中创建一个.wh开头的隐藏文件,从而将文件file1隐藏掉,所以文件file1并未被删除掉,这样也就保证了镜像层数据的完整性和复用性。
有些同学可能会问,每次修改底层的文件时都需要先从底层将文件复制上来,是否会影响容器的性能?答案是会影响,所以一般建议对于容器中需要经常修改的文件不要放到底层的镜像层中,可以在容器运行起来后再将需要频繁修改的文件添加到容器中。