容器的联合文件系统实验
联合文件系统是容器的一个重要特性,它通过分层的方式,共享文件系统,保持数据隔离。在这篇博客中,我将以一个简单的实验来加深对个技术的理解。
实验
生成测试目录
# 创建测试目录 mkdir -p /tmp/lower /tmp/upper /tmp/work /tmp/merged # 在底层目录中创建一些文件 echo "来自底层" > /tmp/lower/file1.txt echo "也是来自底层" > /tmp/lower/file2.txt # 在顶层目录中创建文件 echo "来自顶层" > /tmp/upper/file3.txt
挂载
sudo mount -t overlay overlay -o lowerdir=/tmp/lower,upperdir=/tmp/upper,workdir=/tmp/work /tmp/merged
挂载之后就开始对文件们进行增删改查的测试,来理解联合文件系统的作用。
创建文件
echo "从merged创建" > /tmp/merged/file4.txt ls -la /tmp/upper # files4.txt 在upper可见
修改文件
echo "已被修改" > /tmp/merged/file1.txt # 查看修改结果 cat /tmp/merged/file1.txt # 将显示 "已被修改" cat /tmp/lower/file1.txt # 仍然显示原来的 "来自底层" cat /tmp/upper/file1.txt # 将显示 "已被修改"(被复制到上层后修改)
删除文件
# 删除一个底层文件 rm /tmp/merged/file2.txt # 查看结果 ls -la /tmp/merged # file2.txt 不再可见 ls -la /tmp/lower # file2.txt 仍然存在 ls -la /tmp/upper # file2 变为c开头的占位符
增删改查的影响
通过上面增删改查后不同目录文件的显示效果,可以看到不管是修改哪个文件,都只会改变upper目录中的内容。 对lower中的文件从merger目录修改的时候,就会被复制到upper中然后写入,这就是所谓的cow(copy on write)写时拷贝。
多层
还能够创建多个lower层,这些目录就是构建容器镜像的层,通过cow的方式让这些lower层变得只读,所有的改动都在uppper层,以此来达到镜像的不可变数据隔离的目的。
sudo mount -t overlay overlay -o lowerdir=/tmp/lower1:/tmp/lower2,upperdir=/tmp/upper,workdir=/tmp/work /tmp/merged
卸载 删除
sudo umount /tmp/merged rm -rf /tmp/lower /tmp/upper /tmp/work /tmp/merged