在使用dockerfile构建镜像时,docker会进行分层构建,每个镜像层代表了一个Dockerfile中的instruction(指令),每一个指令都会在原有层的基础上添加新的一层,这些镜像层可以被重复使用,包括在不同的镜像中使用,包括在不同的镜像中使用,可以有效的节省存储空间;
当我们制作镜像时,就是把基础镜像层和我们的容器层做了合并,然后将容器层指向基础镜像层,这样就行程了一个两层的镜像;
镜像制作时,可能有多层镜像层共同依赖底层的基础镜像层:
所以在使用dockerfile时,合理分层,使其能够复用,可以减少磁盘空间的使用;
联合文件系统
docker在构建镜像时,其联合文件系统只会给第一个目录读写权限,其他目录只有只读权限,当用户对某文件做更改时,不会更改源文件,而是将更改保存在具有读读写权限的目录中,当用户需要查看文件时,会讲文件的更改内容与源文件做merge后展示给用户;
docker使用镜像创建容器时,镜像层的内容是不会被修改的,修改存储在容器层,而用户查看容器时,是在视图层,用户在视图层查看到的文件是容器层的修改和镜像层的源文件merge后的文件;
当文件被多层修改后,展示给用户时就需要多层merge后展示给用户,所以分层并非越多越好,当层数过多时,需要合并部分指令;
docker镜像就是很多的目录和文件,创建容器时,mount.namespace将这些镜像的文件挂载到容器中;
容器 = 进程
镜像 = 目录 & 文件