1、介绍OverlayFS是一种目前广泛应用的层次文件系统openwrt、树莓派、docker等上都有应用。它于2014年被合并到Linux3.18内核中顾名思义其主要特性就是“覆盖”OverlayFS将单个Linux主机上的两个目录分层并将它们显示为单个目录。这些目录称为层OverlayFS的下层目录为lowerdir上层目录为upperdir合并目录为merged层次结构如图简单来说overlay 文件系统OverlayFS是一种联合文件系统它能把多个目录层叠加在一起对外呈现为一个统一的目录。Docker 正是利用这个特性实现了镜像的分层存储和容器的写时复制机制。OverlayFS 的核心概念非常清晰主要由三个角色组成术语角色在 Docker 中的对应物主要特性lowerdir只读层Docker 镜像层可以被多个容器共享永不修改。upperdir读写层特定于某个容器的可写层容器运行时的所有修改增、删、改都发生在这里。merged联合视图容器内看到的文件系统upperdir和lowerdir合并后的最终视图。工作原理当你启动一个容器时Docker 会将镜像的各只读层作为lowerdir并为该容器创建一个空的upperdir可写层然后将它们联合挂载到一个merged目录。容器内所有进程看到的就是这个merged目录。任何对文件的修改都会以“写时复制”的方式写入到upperdir而不会改动只读的镜像层。读文件优先从upperdir读如果文件不在upperdir则从lowerdir读。修改文件首次写入时OverlayFS 会将文件从lowerdir复制到upperdir然后再进行修改。这个过程就是著名的copy_up操作。删除文件由于lowerdir是只读的无法真正删除。OverlayFS 会在upperdir中创建一个特殊的whiteout文件来“屏蔽”掉lowerdir中的原文件从merged视图看这个文件就像消失了一样。overlay具有上下合并、同名覆盖、写时拷贝COW等特点具体如下Lowerdir与Upperdir同名文件在 Merged中显示的只有Upperdir中的同名文件不同名文件会合并在Merged中显示修改文件或目录策略1若文件存在于Upperdir则直接修改Upperdir中的文件2若文件只存在于Lowerdir则先将文件从Lowerdir中拷贝至Upperdir再进行修改在Merged层创建文件或目录会直接在Upperdir层创建在Merged层删除文件策略1若文件只存在Upperdir层则直接在Upprdir层删除文件2若文件存在Lowerdir层则在Upperdir层创建一个同名的任何用户都没有任何权限大小为0的字符设备基于以上策略Lowerdir层内容都不会被修改使得在OverlayFS中Lower可以是只读的而Upper则需要是可读写的文件系统。2、测试我们先确认一下当前环境是否在使用overlay2[rootAnolis2 ~]# docker info | grep Storage DriverStorage Driver: overlay2Docker 的所有镜像和容器层数据都存储在/var/lib/docker/overlay2/目录下。我们可以进去看看。[rootAnolis2 ~]# cd /var/lib/docker/overlay2/[rootAnolis2 overlay2]# ls0061705cc93a16d0d3acb45e179a34ca776b817a9d774739f9c627fcc9d6381b 8b494bc6f1be68eec06542faee731549cfe23064e0ecf8514343449119aa1d2800eb0e19b0145619dfaea20d532e7e0030d416e081115f4ef6a737305dff76f5 8c7852b67aadcdd084a1b51612073ab10f7b6b65657c072973a6d8f1f7d8f2d303e69362ce81e7fcdc2d0ffe25bfaef82db49074f666e8421632981bbe325902 8cf0ec0bbaaed40a7bcecc59c8d5d50477cc91f42a4fbe457017b84cc1f4138504f2ef2fed444c87ba43b14ad40ce0aa2d89ecbd69f13af512db9a0225dca935 8d2cd34cbd396f41bd599acaae4940b6c7a39b7f847088f668fb43ba18f17693你会看到很多由长串随机ID命名的目录和一个特殊的l目录长ID目录每个目录代表一个镜像层或容器层。l目录包含了指向这些长ID目录的短名称符号链接。这是为了解决在mount命令参数中路径过长的问题为了更好地理解我们在/tmp下手动创建一个 OverlayFS 挂载看看它到底如何工作1.创建目录[rootAnolis2 overlay2]# cd /tmp/[rootAnolis2 tmp]# mkdir overlay-demo cd overlay-demo[rootAnolis2 overlay-demo]# mkdir lower1 lower2 upper work merged2.在两个 lower 目录里创建不同的文件[rootAnolis2 overlay-demo]# echo I am from lower1 lower1/lower1.txt[rootAnolis2 overlay-demo]# echo I am from lower2 lower2/lower2.txt3.在 lower2 中创建一个和 lower1 同名的文件用来演示“覆盖”[rootAnolis2 overlay-demo]# echo I am the original in lower2 lower2/conflict.txt4.使用 mount 命令进行联合挂载[rootAnolis2 overlay-demo]# mount -t overlay overlay \ -o lowerdir./lower2:./lower1,upperdir./upper,workdir./work \ ./merged5.查看合并后的目录输出: conflict.txt lower1.txt lower2.txt (三个文件都在)[rootAnolis2 overlay-demo]# ls ./mergedconflict.txt lower1.txt lower2.txt查看文件内容验证同名文件的优先级 (lower2 会覆盖 lower1)[rootAnolis2 overlay-demo]# cat ./merged/conflict.txtI am the original in lower26.在 merged 目录下新建和修改文件[rootAnolis2 overlay-demo]# rm ./merged/lower1.txtrm是否删除普通文件 ./merged/lower1.txty7.查看[rootAnolis2 overlay-demo]# ls -l ./upper/总用量 4c--------- 2 root root 0, 0 3月 17 00:46 lower1.txt-rw-r--r-- 1 root root 9 3月 17 00:46 new.txt输出: new.txt lower1.txt[rootAnolis2 overlay-demo]# file ./upper/lower1.txt./upper/lower1.txt: character special (0/0)输出: ./upper/lower1.txt: character special (0/0) # 这就是 whiteout 文件lower1和lower2的内容被合并。当文件在多个lowerdir中存在时最左边优先级最高的会生效。在merged中新建和修改的文件都出现在upper目录中。在merged中删除一个来自lowerdir的文件会在upper目录中留下一个 whiteout 文件作为标记。3、容器测试运行一个容器[rootAnolis2 ~]# docker run -d --name overlay-test nginx9ce1941408e1cb53f476916a4725a780794c02c74858ae5d6149b078129826a6[rootAnolis2 ~]# docker inspect overlay-test | grep -A 10 GraphDriverGraphDriver: {Data: {LowerDir: /var/lib/docker/overlay2/c540679f9649e6e30883a9eec04618700661d7bf5bed6e681a1ae23b7384e0c0-init/diff:/var/lib/docker/overlay2/6d13487122c3d9d703ae2fcc6fe94515c794132a5b852721b0cb5c40fb98ff67/diff:/var/lib/docker/overlay2/8cf0ec0bbaaed40a7bcecc59c8d5d50477cc91f42a4fbe457017b84cc1f41385/diff:/var/lib/docker/overlay2/00eb0e19b0145619dfaea20d532e7e0030d416e081115f4ef6a737305dff76f5/diff:/var/lib/docker/overlay2/faa1271b8ef17994d751582f40a4feec7bca55be6e6938e0ab66cf4e4fbdebf5/diff:/var/lib/docker/overlay2/869ef440029c2065ced2105e51d9a448187f466eb649d2f0a8038a97c0574933/diff:/var/lib/docker/overlay2/97f4a8e3af893b4bfa185e8f9ee66a6da2d83c1cc1b4694fdab73443c8c1ab81/diff:/var/lib/docker/overlay2/17d522a5713fe3d6cb73ef19de4455f6ad08f2ad0e91eec612fcd166a32427a7/diff,MergedDir: /var/lib/docker/overlay2/c540679f9649e6e30883a9eec04618700661d7bf5bed6e681a1ae23b7384e0c0/merged,UpperDir: /var/lib/docker/overlay2/c540679f9649e6e30883a9eec04618700661d7bf5bed6e681a1ae23b7384e0c0/diff,WorkDir: /var/lib/docker/overlay2/c540679f9649e6e30883a9eec04618700661d7bf5bed6e681a1ae23b7384e0c0/work},Name: overlay2},Mounts: [],Config: {
Docker——overlay文件系统
1、介绍OverlayFS是一种目前广泛应用的层次文件系统openwrt、树莓派、docker等上都有应用。它于2014年被合并到Linux3.18内核中顾名思义其主要特性就是“覆盖”OverlayFS将单个Linux主机上的两个目录分层并将它们显示为单个目录。这些目录称为层OverlayFS的下层目录为lowerdir上层目录为upperdir合并目录为merged层次结构如图简单来说overlay 文件系统OverlayFS是一种联合文件系统它能把多个目录层叠加在一起对外呈现为一个统一的目录。Docker 正是利用这个特性实现了镜像的分层存储和容器的写时复制机制。OverlayFS 的核心概念非常清晰主要由三个角色组成术语角色在 Docker 中的对应物主要特性lowerdir只读层Docker 镜像层可以被多个容器共享永不修改。upperdir读写层特定于某个容器的可写层容器运行时的所有修改增、删、改都发生在这里。merged联合视图容器内看到的文件系统upperdir和lowerdir合并后的最终视图。工作原理当你启动一个容器时Docker 会将镜像的各只读层作为lowerdir并为该容器创建一个空的upperdir可写层然后将它们联合挂载到一个merged目录。容器内所有进程看到的就是这个merged目录。任何对文件的修改都会以“写时复制”的方式写入到upperdir而不会改动只读的镜像层。读文件优先从upperdir读如果文件不在upperdir则从lowerdir读。修改文件首次写入时OverlayFS 会将文件从lowerdir复制到upperdir然后再进行修改。这个过程就是著名的copy_up操作。删除文件由于lowerdir是只读的无法真正删除。OverlayFS 会在upperdir中创建一个特殊的whiteout文件来“屏蔽”掉lowerdir中的原文件从merged视图看这个文件就像消失了一样。overlay具有上下合并、同名覆盖、写时拷贝COW等特点具体如下Lowerdir与Upperdir同名文件在 Merged中显示的只有Upperdir中的同名文件不同名文件会合并在Merged中显示修改文件或目录策略1若文件存在于Upperdir则直接修改Upperdir中的文件2若文件只存在于Lowerdir则先将文件从Lowerdir中拷贝至Upperdir再进行修改在Merged层创建文件或目录会直接在Upperdir层创建在Merged层删除文件策略1若文件只存在Upperdir层则直接在Upprdir层删除文件2若文件存在Lowerdir层则在Upperdir层创建一个同名的任何用户都没有任何权限大小为0的字符设备基于以上策略Lowerdir层内容都不会被修改使得在OverlayFS中Lower可以是只读的而Upper则需要是可读写的文件系统。2、测试我们先确认一下当前环境是否在使用overlay2[rootAnolis2 ~]# docker info | grep Storage DriverStorage Driver: overlay2Docker 的所有镜像和容器层数据都存储在/var/lib/docker/overlay2/目录下。我们可以进去看看。[rootAnolis2 ~]# cd /var/lib/docker/overlay2/[rootAnolis2 overlay2]# ls0061705cc93a16d0d3acb45e179a34ca776b817a9d774739f9c627fcc9d6381b 8b494bc6f1be68eec06542faee731549cfe23064e0ecf8514343449119aa1d2800eb0e19b0145619dfaea20d532e7e0030d416e081115f4ef6a737305dff76f5 8c7852b67aadcdd084a1b51612073ab10f7b6b65657c072973a6d8f1f7d8f2d303e69362ce81e7fcdc2d0ffe25bfaef82db49074f666e8421632981bbe325902 8cf0ec0bbaaed40a7bcecc59c8d5d50477cc91f42a4fbe457017b84cc1f4138504f2ef2fed444c87ba43b14ad40ce0aa2d89ecbd69f13af512db9a0225dca935 8d2cd34cbd396f41bd599acaae4940b6c7a39b7f847088f668fb43ba18f17693你会看到很多由长串随机ID命名的目录和一个特殊的l目录长ID目录每个目录代表一个镜像层或容器层。l目录包含了指向这些长ID目录的短名称符号链接。这是为了解决在mount命令参数中路径过长的问题为了更好地理解我们在/tmp下手动创建一个 OverlayFS 挂载看看它到底如何工作1.创建目录[rootAnolis2 overlay2]# cd /tmp/[rootAnolis2 tmp]# mkdir overlay-demo cd overlay-demo[rootAnolis2 overlay-demo]# mkdir lower1 lower2 upper work merged2.在两个 lower 目录里创建不同的文件[rootAnolis2 overlay-demo]# echo I am from lower1 lower1/lower1.txt[rootAnolis2 overlay-demo]# echo I am from lower2 lower2/lower2.txt3.在 lower2 中创建一个和 lower1 同名的文件用来演示“覆盖”[rootAnolis2 overlay-demo]# echo I am the original in lower2 lower2/conflict.txt4.使用 mount 命令进行联合挂载[rootAnolis2 overlay-demo]# mount -t overlay overlay \ -o lowerdir./lower2:./lower1,upperdir./upper,workdir./work \ ./merged5.查看合并后的目录输出: conflict.txt lower1.txt lower2.txt (三个文件都在)[rootAnolis2 overlay-demo]# ls ./mergedconflict.txt lower1.txt lower2.txt查看文件内容验证同名文件的优先级 (lower2 会覆盖 lower1)[rootAnolis2 overlay-demo]# cat ./merged/conflict.txtI am the original in lower26.在 merged 目录下新建和修改文件[rootAnolis2 overlay-demo]# rm ./merged/lower1.txtrm是否删除普通文件 ./merged/lower1.txty7.查看[rootAnolis2 overlay-demo]# ls -l ./upper/总用量 4c--------- 2 root root 0, 0 3月 17 00:46 lower1.txt-rw-r--r-- 1 root root 9 3月 17 00:46 new.txt输出: new.txt lower1.txt[rootAnolis2 overlay-demo]# file ./upper/lower1.txt./upper/lower1.txt: character special (0/0)输出: ./upper/lower1.txt: character special (0/0) # 这就是 whiteout 文件lower1和lower2的内容被合并。当文件在多个lowerdir中存在时最左边优先级最高的会生效。在merged中新建和修改的文件都出现在upper目录中。在merged中删除一个来自lowerdir的文件会在upper目录中留下一个 whiteout 文件作为标记。3、容器测试运行一个容器[rootAnolis2 ~]# docker run -d --name overlay-test nginx9ce1941408e1cb53f476916a4725a780794c02c74858ae5d6149b078129826a6[rootAnolis2 ~]# docker inspect overlay-test | grep -A 10 GraphDriverGraphDriver: {Data: {LowerDir: /var/lib/docker/overlay2/c540679f9649e6e30883a9eec04618700661d7bf5bed6e681a1ae23b7384e0c0-init/diff:/var/lib/docker/overlay2/6d13487122c3d9d703ae2fcc6fe94515c794132a5b852721b0cb5c40fb98ff67/diff:/var/lib/docker/overlay2/8cf0ec0bbaaed40a7bcecc59c8d5d50477cc91f42a4fbe457017b84cc1f41385/diff:/var/lib/docker/overlay2/00eb0e19b0145619dfaea20d532e7e0030d416e081115f4ef6a737305dff76f5/diff:/var/lib/docker/overlay2/faa1271b8ef17994d751582f40a4feec7bca55be6e6938e0ab66cf4e4fbdebf5/diff:/var/lib/docker/overlay2/869ef440029c2065ced2105e51d9a448187f466eb649d2f0a8038a97c0574933/diff:/var/lib/docker/overlay2/97f4a8e3af893b4bfa185e8f9ee66a6da2d83c1cc1b4694fdab73443c8c1ab81/diff:/var/lib/docker/overlay2/17d522a5713fe3d6cb73ef19de4455f6ad08f2ad0e91eec612fcd166a32427a7/diff,MergedDir: /var/lib/docker/overlay2/c540679f9649e6e30883a9eec04618700661d7bf5bed6e681a1ae23b7384e0c0/merged,UpperDir: /var/lib/docker/overlay2/c540679f9649e6e30883a9eec04618700661d7bf5bed6e681a1ae23b7384e0c0/diff,WorkDir: /var/lib/docker/overlay2/c540679f9649e6e30883a9eec04618700661d7bf5bed6e681a1ae23b7384e0c0/work},Name: overlay2},Mounts: [],Config: {