容器的联合文件系统实验

Table of Contents

联合文件系统是容器的一个重要特性,它通过分层的方式,共享文件系统,保持数据隔离。在这篇博客中,我将以一个简单的实验来加深对个技术的理解。

实验

生成测试目录

# 创建测试目录
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