Docker的存储系统
Images and layers
Docker镜像是由一系列图层构建而成的。每个图层代表图像的Dockerfile中的一条指令。除最后一层以外的每一层都是只读的
FROM ubuntu:15.04
COPY . /app
RUN make /app
CMD python /app/app.py
这个Dockerfile包含四个命令,每个命令创建一个图层。该 FROM声明通过创建从一个层开出ubuntu:15.04的图像。该COPY命令从您的Docker客户端的当前目录添加一些文件。该RUN命令使用该命令构建您的应用程序make。最后,最后一层指定在容器内运行的命令。
每一层只是一个与它之前的层的差异。这些图层堆叠在一起。当你创建一个新的容器时,你在底层上添加一个新的可写层。这个层通常被称为“容器层”。对正在运行的容器所做的所有更改(如写入新文件,修改现有文件和删除文件)都将写入此可写容器层
image.png容器和图像之间的主要区别是最高的可写层。所有写入到添加新的或修改现有数据的容器的操作都存储在这个可写入的层中。当容器被删除时,可写层也被删除。底层的图像保持不变。
container和layer
由于每个容器都有自己的可写容器层,并且所有更改都存储在此容器层中,因此多个容器可以共享对相同基础映像的访问权限,并且拥有自己的数据状态。下图显示了共享相同Ubuntu 15.04映像的多个容器。
image.png
容器和图像之间的主要区别是最高的可写层。所有写入到添加新的或修改现有数据的容器的操作都存储在这个可写入的层中。当容器被删除时,可写层也被删除。底层的图像保持不变。
磁盘上的容器大小
要查看正在运行的容器的大小,可以使用该docker ps -s 命令。两个不同的列与大小有关。
size:用于每个容器的可写层的数据量(在磁盘上)
virtual size:用于容器加上容器可写层的只读图像数据的数据量size。多个容器可能共享部分或全部只读图像数据。从同一图像开始的两个容器共享只读数据的100%,而具有不同图像的具有共同层的两个容器共享这些公共层。
磁盘上所有正在运行的容器使用的总磁盘空间是每个容器size和virtual size值的组合。
写时复制(CoW)策略
写入时复制是一种共享和复制文件以实现最高效率的策略。如果一个文件或目录存在于图像的下层,而另一层(包括可写层)需要对其进行读取访问,则只使用现有的文件。第一次需要修改文件(构建图像或运行容器时),该文件将被复制到该图层并进行修改。这最大限度地减少了I / O和每个后续层的大小。下面将更深入地解释这些优点。
翻译:https://docs.docker.com/storage/storagedriver/#images-and-layers