在 ubuntu 系统下的 docker 中使用 overlayfs 作为存储驱动,测试 overlayfs 的基本功能。
1. 安装 docker
安装过程参考Docker 官方文档。
2. 查看版本
2.1 查看 docker 版本
2.2 查看 docker 存储驱动版本
1
| docker info | grep "Storage Driver"
|
2.3 查看 overlayfs 版本
3. 安装一个测试镜像
1
| docker pull ubuntu:latest
|
3.1 查看镜像列表
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"
}
|
由于此时还没有创建任何容器,所以只有 MergedDir,UpperDir和 WorkDir 三个目录。
创建容器后会增加一个 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
|
注意,前面的测试仅限在docker没有运行的情况下进行挂载。如果docker正在运行,则可以直接访问 7.1 返回的 MergedDir 目录,直接查看容器的文件系统。
7.3 修改容器的文件系统
1
| echo "hello world" > $mount_dir/xzxz_test/test.txt
|
7.4 umount 卸载挂载的文件系统
8. 启动容器并进入bash
1
2
| docker start test_ubuntu
docker exec -it test_ubuntu /bin/bash
|
9. 查看容器的文件系统
可以看到我们在挂载的文件系统中修改的内容已经被写入到容器的文件系统中了。