文章

docker overlayfs 初探

简单测试 docker overlayfs

docker overlayfs 初探

在 ubuntu 系统下的 docker 中使用 overlayfs 作为存储驱动,测试 overlayfs 的基本功能。

1. 安装 docker

安装过程参考Docker 官方文档

2. 查看版本

2.1 查看 docker 版本

1
docker --version

2.2 查看 docker 存储驱动版本

1
docker info | grep "Storage Driver"

docker 存储驱动

2.3 查看 overlayfs 版本

1
modinfo overlay

3. 安装一个测试镜像

1
docker pull ubuntu:latest

3.1 查看镜像列表

1
docker images

docker 镜像列表

3.2 查看镜像详细信息

1
docker inspect ubuntu:latest

我们关注的主要是 GraphDriver 字段,表示当前镜像使用的存储驱动。

1
2
3
4
5
6
7
8
"GraphDriver": {
  "Data": {
      "MergedDir": "/var/lib/docker/overlay2/2957a7451b70fcc0aad78a56b5f027df4b2a74c028c0dd26d823d14fed659639/merged",
      "UpperDir": "/var/lib/docker/overlay2/2957a7451b70fcc0aad78a56b5f027df4b2a74c028c0dd26d823d14fed659639/diff",
      "WorkDir": "/var/lib/docker/overlay2/2957a7451b70fcc0aad78a56b5f027df4b2a74c028c0dd26d823d14fed659639/work"
  },
  "Name": "overlay2"
}

GraphDriver

由于此时还没有创建任何容器,所以只有 MergedDirUpperDirWorkDir 三个目录。

创建容器后会增加一个 LowerDir 字段,表示当前镜像的只读层。

4. 创建一个容器

1
docker run -it --name test_ubuntu ubuntu:latest /bin/bash

此时会创建一个名为 test_ubuntu 的容器,并进入容器的 bash 环境。

4.1 在容器中创建目录,以供后续测试

测试在容器内部创建一个新的文件夹 xzxz_test,并在其中创建一个文件 test.txt,然后退出容器。

1
2
3
4
mkdir xzxz_test
cd xzxz_test
touch test.txt
exit

退出容器后如果想要再次进入容器,可以使用以下命令:

1
2
docker start test_ubuntu
docker exec -it test_ubuntu /bin/bash

5. 停止容器

1
docker stop test_ubuntu

6. 在不启动容器的情况下查看容器的文件系统更改

1
docker diff test_ubuntu

7. 在不启动容器的情况下挂载容器的文件系统

7.1 查看容器的文件系统挂载点

1
docker inspect test_ubuntu
1
2
3
4
5
6
7
8
9
10
"GraphDriver": {
  "Data": {
      "ID": "d29a03c149164152e5795600b9621b88b86e2f5d2160889f88b8ff365056cda4",
      "LowerDir": "/var/lib/docker/overlay2/046ada8540fa6e2db60a49052f80e61bdce9bc2865935e67b870a9d54ac12e2a-init/diff:/var/lib/docker/overlay2/2957a7451b70fcc0aad78a56b5f027df4b2a74c028c0dd26d823d14fed659639/diff",
      "MergedDir": "/var/lib/docker/overlay2/046ada8540fa6e2db60a49052f80e61bdce9bc2865935e67b870a9d54ac12e2a/merged",
      "UpperDir": "/var/lib/docker/overlay2/046ada8540fa6e2db60a49052f80e61bdce9bc2865935e67b870a9d54ac12e2a/diff",
      "WorkDir": "/var/lib/docker/overlay2/046ada8540fa6e2db60a49052f80e61bdce9bc2865935e67b870a9d54ac12e2a/work"
  },
  "Name": "overlay2"
}

7.2 挂载容器的文件系统

1
2
3
4
5
6
7
mount_dir="/mnt/test_ubuntu"
mkdir -p $mount_dir
mount -t overlay overlay -o \
lowerdir=/var/lib/docker/overlay2/2957a7451b70fcc0aad78a56b5f027df4b2a74c028c0dd26d823d14fed659639/diff:/var/lib/docker/overlay2/046ada8540fa6e2db60a49052f80e61bdce9bc2865935e67b870a9d54ac12e2a-init/diff,\
upperdir=/var/lib/docker/overlay2/046ada8540fa6e2db60a49052f80e61bdce9bc2865935e67b870a9d54ac12e2a/diff,\
workdir=/var/lib/docker/overlay2/046ada8540fa6e2db60a49052f80e61bdce9bc2865935e67b870a9d54ac12e2a/work $mount_dir
ls $mount_dir

直接挂载overlayfs看到之前创建的文件内容

注意,前面的测试仅限在docker没有运行的情况下进行挂载。如果docker正在运行,则可以直接访问 7.1 返回的 MergedDir 目录,直接查看容器的文件系统。

7.3 修改容器的文件系统

1
echo "hello world" > $mount_dir/xzxz_test/test.txt

7.4 umount 卸载挂载的文件系统

1
umount $mount_dir

8. 启动容器并进入bash

1
2
docker start test_ubuntu
docker exec -it test_ubuntu /bin/bash

9. 查看容器的文件系统

1
cat xzxz_test/test.txt

容器内部看到之前修改的内容

可以看到我们在挂载的文件系统中修改的内容已经被写入到容器的文件系统中了。

本文由作者按照 CC BY 4.0 进行授权

© xzxz. 保留部分权利。

本站采用 Jekyll 主题 Chirpy