同样是用 overlay 联合文件系统 实现容器路径 和 宿主机路径的映射。
测试挂载效果
我们把/root/tmp/abc作为映射到宿主机的目录,并且作为upperdir上层读写层。把容器中的merged目录作为lower只读层,形成宗卷映射,最后重新把merged目录作为挂载点,重新挂载回了merged目录。
1. 首先挂载
root@debian:~/tmp/overlay# mount -t overlay overlay -o lowerdir=./merged,upperdir=/root/tmp/abc,workdir=./work ./merged
2. 实验一
测试容器内目录创建文件,宿主机目录变化。在merged目录,即容器中创建一个merged.txt。可以看到/root/tmp/abc作为读写层也看到了新创建的文件。
root@debian:~/tmp/overlay# ls merged/abc.txtroot@debian:~/tmp/overlay# touch merged/merged.txtroot@debian:~/tmp/overlay# cd ..root@debian:~/tmp# tree.|-- abc| |-- abc.txt| `-- merged.txt`-- overlay|-- lower| |-- ld| | `-- ld.txt| `-- ld1.txt|-- merged| |-- abc.txt| `-- merged.txt|-- upper| |-- ld1.txt| |-- ud| | `-- ud.txt| `-- ud2.txt`-- work`-- work9 directories, 9 files
3. 实验二
测试宿主机目录创建文件,容器内目录变化。在root/tmp/abc目录,即宿主机中创建一个abcdddd.txt。可以看到容器中merged目录作为挂载点,也看到了新创建的文件。
root@debian:~/tmp# touch abc/abcdddd.txtroot@debian:~/tmp# tree.|-- abc| |-- abc.txt| |-- abcdddd.txt| `-- merged.txt`-- overlay|-- lower| |-- ld| | `-- ld.txt| `-- ld1.txt|-- merged| |-- abc.txt| |-- abcdddd.txt| `-- merged.txt|-- upper| |-- ld1.txt| |-- ud| | `-- ud.txt| `-- ud2.txt`-- work`-- work9 directories, 11 files
3. 实验三
测试容器删除后的效果。umout取消挂载merged目录的挂载点,可以看到merged目录刚刚创建的文件都没了,不要慌张,我们可以在宿主机root/tmp/abc中的看到它们,这样就轻松实现了volume宗卷挂载。当再次重启容器的时候,只需要重新把宿主机的目录作为读写层,容器目录既作为只读层又作为挂载点就可以轻松恢复原状。
root@debian:~/tmp/overlay# umount /root/tmp/overlay/mergedroot@debian:~/tmp/overlay# lslower merged upper workroot@debian:~/tmp/overlay# ls merged/root@debian:~/tmp/overlay# cd ..root@debian:~/tmp# tree.|-- abc| |-- abc.txt| |-- abcdddd.txt| `-- merged.txt`-- overlay|-- lower| |-- ld| | `-- ld.txt| `-- ld1.txt|-- merged|-- upper| |-- ld1.txt| |-- ud| | `-- ud.txt| `-- ud2.txt`-- work`-- work9 directories, 8 files
挂载数据卷的过程
- 读取宿主机的文件目录,创建宿主机的文件目录(如果不存在的话),(/root/${parentURL}),作读写层
- 读取容器的挂载点目录,在容器文件系统中创建挂载点目录(/root/mnt/${containerURL}),作只读层
- 把宿主机文件目录 和 容器文件系统中的 挂载点目录 用overlay 挂载到容器的挂载点
运行容器效果
- 运行一个容器示例,在容器内container文件夹创建一个123.txt文件

root@debian:~/GoWork/src/github.com/devhg/ddocker# go build .root@debian:~/GoWork/src/github.com/devhg/ddocker# ./ddocker run -it -v /root/volume:/container shshtrue{"level":"info","msg":"[/proc/self/exe init]","time":"2021-08-30T17:11:30+08:00"}{"level":"error","msg":"mkdir /root/busybox/ error: mkdir /root/busybox/: file exists","time":"2021-08-30T17:11:30+08:00"}{"level":"info","msg":"/sys/fs/cgroup/memory/ddocker-cgroup/tasks","time":"2021-08-30T17:11:30+08:00"}{"level":"info","msg":"init come on","time":"2021-08-30T17:11:30+08:00"}{"level":"info","msg":"command all is sh","time":"2021-08-30T17:11:30+08:00"}{"level":"info","msg":"current location is: /root/mnt","time":"2021-08-30T17:11:30+08:00"}{"level":"info","msg":"found path is /bin/sh","time":"2021-08-30T17:11:30+08:00"}{"level":"info","msg":"/bin/sh [sh]","time":"2021-08-30T17:11:30+08:00"}/ # lsbin container dev etc home proc root sys tmp usr var/ # cd container//container # ls/container # pwd/container/container # touch 123.txt/container # ls123.txt/container #
- 查看宿主机映射路径/root/volume情况,挂载数据卷成功

- 容器停止只有,宿主机路径文件仍然存在

- 重新运行容器,容器中复原宿主机的数据卷

