佛山百度网站排名优化,做的好的茶叶网站,国内设计好的网站案例,360搜索引擎下载上一篇文章中#xff0c;仔细讲解了Docker是如何改变当前的root文件系统以及mount等操作。
本文继续讲解Docker是如何实现Volum数据卷的。
实现Volume数据卷
获取代码
git clone https://gitee.com/mjreams/docker.git
上一小节介绍了如何使用AUFS包装busybox#xff0c…上一篇文章中仔细讲解了Docker是如何改变当前的root文件系统以及mount等操作。
本文继续讲解Docker是如何实现Volum数据卷的。
实现Volume数据卷
获取代码
git clone https://gitee.com/mjreams/docker.git
上一小节介绍了如何使用AUFS包装busybox从而实现容器和镜像的分离。但是一旦容器退出容器可写层的所有内容都会被删除。那么如果用户需要持久化容器里的部分数据该怎么办呢volume就是用来解决这个问题的。
本节将会介绍如何实现将宿主机的目录作为数据卷挂载到容器中井且在容器退出后数据卷中的内容仍然能够保存在宿主机上。
使用 AUFS 创建容器文件系统的实现过程如下。
启动容器的时候 1. 创建只读层(busybox) 2. 创建容器读写层(writeLayer) 3. 创建挂载点(mnt)并把只读层和读写层挂载到挂载点 4. 将挂载点作为容器的根目录。 容器退出的时候 5. 卸载挂载点mnt的文件系统 6. 删除挂载点 7. 删除读写层writeLayer
本篇内容就是要在这个文件基础上添加绑定宿主机文件夹到饿容器数据卷的功能。
首先在main_command.go文件的runCommand命令中添加-v标签
cli.StringFlag{Name: v,Usage: volume,}, 在Run函数中把volume传给创建容器的NewParentProcess函数和删除容器文件系统的Delete WorkSpace函数。
见run.go 在NewWorkSpace函数中继续把volume值传给创建容器文件系统的NewWorkSpace方法。
见container/container_process.go 创建容器文件系统的过程如下 1. 创建只读层。 2. 创建容器读写层 3. 创建挂载点并把只读层和读写层挂载到挂载点上。 4. 接下来首先要判断Volume是否为空如果是就表示用户并没有使用挂载标签结束创建过程。 5. 如果不为空则解析volume字符串 6. 当解析volume字符串返回的字符数组长度为2并且数据元素均不为空的时候则执行MountVolume函数来挂载数据卷。 7. 否则提示用户创建数据卷输入值不对。
见container/volume.go 挂载数据卷的过程如下 1. 首先读取宿主机文件目录URL创建宿主机文件目录/root/${parentUrl。 2. 然后读取容器挂载点URL在容器文件系统里创建挂载点C/root/mnt/${containerUrl。 3. 最后把宿主机文件目录挂载到容器挂载点。这样启动容器的过程对数据卷的处理也就完成了。
见container/volume.go 删除容器文件系统的过程如下 1. 只有在volume不为空并且解析volume字符串返回的字符数组长度为2数据元素均不为空的时候才执行DeleteVolume函数来处理。 2. 其余的情况仍然使用前面的DeleteMountPoint函数。 DeleteVolume 处理逻辑 1. 首先卸载volume挂载点的文件系统/root/mnt/${containerUrl}保证整个容器的挂载点没有被使用。 2. 然后再卸载整个容器文件系统的挂载点C/root/mnt。 3. 最后删除容器文件系统挂载点。整个容器退出过程中的文件系统处理就结束了。
流程图 验证测试
启动一个容器把宿主机的/root/volume挂载到容器的/containerVolume目录下。 可以看到/root下多了一个volume文件
容器里执行ls可以看到多了一个containerVolume
sh-5.1# ls
containerVolume
sh-5.1#
由于源代码使用的是aufs文件系统而本地机器是overlay文件系统因此后续测试流程不再演示后续本文将会把代码修改成overlay文件系统