Docker overlay存储工作原理

 

一、镜像与分层

一个镜像由多个分层组成。Dockerfile中写有每个分层,比如:

FROM ubuntu:18.04
COPY . /app
RUN make /app
CMD python /app/app.py

dockerfile中每一行指令都会创建一个层次。每一层保留只有与前一层有差异的部分,一次次进行叠加。当你创建一个‘容器’时,顶层将会创建一个读写层。这个读写层就称之为“容器层”。容器中的文件增加、删除、修改,都在容器层中操作。这些层级之间文件操作由docker的storage driver来进行实现。

Docker overlay存储工作原理_第1张图片

二、OverlayFS 工作原理

overlay是storage driver的一种实现。可在/etc/docker/daemon.json中设置

{
  "storage-driver": "overlay2"
}

overlay有两层结构,底层叫lowerdir,上层叫upperdir,然后通过merged来提供一个最终合成的视图,来作为容器的实际挂载点。

overlayfs lowerdir, upperdir, merged

overlay只有两层,这意味着他无法由多层的镜像组成。镜像的每一层,都在目录/var/lib/docker/overlay下有他自己的目录。

创建一个容器时,镜像的最顶层作为lowerdir(只读),容器中新创建的文件就在upperdir层(可写)

三、宿主机磁盘中的overlay存放方式

/var/lib/docker/overlay/中,每个镜像层都有他自己的文件夹。每一层都只包含他独有的一些文件,与底层共享的那些文件则通过硬链接的方式实现。可高效利用磁盘空间。

$ ls -l /var/lib/docker/overlay/

total 20
drwx------ 3 root root 4096 Jun 20 16:11 38f3ed2eac129654acef11c32670b534670c3a06e483fce313d72e3e0a15baa8
drwx------ 3 root root 4096 Jun 20 16:11 55f1e14c361b90570df46371b20ce6d480c434981cbda5fd68c6ff61aa0a5358
drwx------ 3 root root 4096 Jun 20 16:11 824c8a961a4f5e8fe4f4243dab57c5be798e7fd195f6d88ab06aea92ba931654
drwx------ 3 root root 4096 Jun 20 16:11 ad0fe55125ebf599da124da175174a4b8c1878afe6907bf7c78570341f308461
drwx------ 3 root root 4096 Jun 20 16:11 edab9b5e5bf73f2997524eebeac1de4cf9c8b904fa8ad3ec43b3504196aa3801
$ ls -i /var/lib/docker/overlay/38f3ed2eac129654acef11c32670b534670c3a06e483fce313d72e3e0a15baa8/root/bin/ls

19793696 /var/lib/docker/overlay/38f3ed2eac129654acef11c32670b534670c3a06e483fce313d72e3e0a15baa8/root/bin/ls

$ ls -i /var/lib/docker/overlay/55f1e14c361b90570df46371b20ce6d480c434981cbda5fd68c6ff61aa0a5358/root/bin/ls

19793696 /var/lib/docker/overlay/55f1e14c361b90570df46371b20ce6d480c434981cbda5fd68c6ff61aa0a5358/root/bin/ls

 四、用overlay时,容器读写文件的机制

读文件:

1、容器层中无文件:从lowerdir中读取

2、只有容器层中有文件:直接总容器层中读取

3、容器层与镜像层都有:读容器层中的文件,再隐藏镜像层中的同名文件

文件修改:

第一次写文件:先从镜像复制文件到容器层,在容器层中修改文件

删除文件:容器层中的文件变空文件,但是镜像层中的文件任然未变

重命名目录:只有源和目的路径都在顶层时,才能重命名。

五、性能

overlay的性能比aufs和devicemapper好。

对于读写频繁的文件,需要放入volume存储卷。这些可以跳过storage driver,减少写时拷贝(copy on write)的操作

你可能感兴趣的:(Docker)