Docker实战10|实现volum数据卷

上一篇文章中,仔细讲解了Docker是如何改变当前的root文件系统以及mount等操作。

本文继续讲解Docker是如何实现Volum数据卷的。

实现Volume数据卷

获取代码

git clone https://gitee.com/mjreams/docker.git

上一小节介绍了如何使用AUFS包装busybox,从而实现容器和镜像的分离。但是一旦容器退出,容器可写层的所有内容都会被删除。那么,如果用户需要持久化容器里的部分数据该怎么办呢?volume就是用来解决这个问题的。

本节将会介绍如何实现将宿主机的目录作为数据卷挂载到容器中,井且在容器退出后,数据卷中的内容仍然能够保存在宿主机上。

使用 AUFS 创建容器文件系统的实现过程如下。

启动容器的时候:

  1. 1. 创建只读层(busybox);

  2. 2. 创建容器读写层(writeLayer);

  3. 3. 创建挂载点(mnt),并把只读层和读写层挂载到挂载点;

  4. 4. 将挂载点作为容器的根目录。

    容器退出的时候

  5. 5. 卸载挂载点(mnt)的文件系统;

  6. 6. 删除挂载点;

  7. 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. 1. 创建只读层。

  2. 2. 创建容器读写层

  3. 3. 创建挂载点并把只读层和读写层挂载到挂载点上。

  4. 4. 接下来,首先要判断Volume是否为空,如果是,就表示用户并没有使用挂载标签,结束创建过程。

  5. 5. 如果不为空,则解析volume字符串

  6. 6. 当解析volume字符串返回的字符数组长度为2,并且数据元素均不为空的时候,则执行MountVolume函数来挂载数据卷。

  7. 7. 否则,提示用户创建数据卷输入值不对。

container/volume.go

图片

挂载数据卷的过程如下

  1. 1. 首先,读取宿主机文件目录URL,创建宿主机文件目录(/root/${parentUrl})。

  2. 2. 然后,读取容器挂载点URL,在容器文件系统里创建挂载点C/root/mnt/${containerUrl})。

  3. 3. 最后,把宿主机文件目录挂载到容器挂载点。这样启动容器的过程,对数据卷的处理也就完成了。

container/volume.go

删除容器文件系统的过程如下

  1. 1. 只有在volume不为空,并且解析volume字符串返回的字符数组长度为2,数据元素均不为空的时候,才执行DeleteVolume函数来处理。

  2. 2. 其余的情况仍然使用前面的DeleteMountPoint函数。

图片

DeleteVolume 处理逻辑

  1. 1. 首先,卸载volume挂载点的文件系统(/root/mnt/${containerUrl}),保证整个容器的挂载点没有被使用。

  2. 2. 然后,再卸载整个容器文件系统的挂载点C/root/mnt)。

  3. 3. 最后,删除容器文件系统挂载点。整个容器退出过程中的文件系统处理就结束了。

流程图

图片

验证测试

启动一个容器,把宿主机的/root/volume挂载到容器的/containerVolume目录下。

可以看到/root下多了一个volume文件

容器里执行ls,可以看到多了一个containerVolume

sh-5.1# ls
containerVolume
sh-5.1# 

由于源代码使用的是aufs文件系统,而本地机器是overlay文件系统,因此后续测试流程不再演示,后续本文将会把代码修改成overlay文件系统

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/611528.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows11快速安装Android子系统

很多小伙伴想在电脑运行一下安卓程序,或则上班用手机摸鱼不方便,用电脑又没有想要的手机软件,那么怎么用电脑来安装安卓软件呢? 首先设置地区 安装Android子系统的前提需要安装 Amazon Appstore 这个应用,内地不能下载…

【博士每天一篇论文-算法】Optimal modularity and memory capacity of neural reservoirs

阅读时间:2023-11-15 1 介绍 年份:2019 作者:Nathaniel Rodriguez 印第安纳大学信息学、计算和工程学院,美国印第安纳州布卢明顿 期刊: Network Neuroscience 引用量:39 这篇论文主要研究了神经网络的模块…

SpringBoot+Redis实现接口防刷功能

场景描述: 在实际开发中,当前端请求后台时,如果后端处理比较慢,但是用户是不知情的,此时后端仍在处理,但是前端用户以为没点到,那么再次点击又发起请求,就会导致在短时间内有很多请求…

RK3568平台开发系列讲解(Linux系统篇)Linux 内核打印

🚀返回总目录 文章目录 一、方法一:dmseg 命令二、方法二:查看 kmsg 文件三、方法三:调整内核打印等级一、方法一:dmseg 命令 在终端使用 dmseg 命令可以获取内核打印信息,该命令的具体使用方法如下所示: 首先在串口终端使用 “dmseg”命令,可以看见相应的内核打印信息…

Windows.OpenSSL生成ssl证书配置到nginx

一、下载OpenSSL程序安装 到E:\soft\OpenSSL-Win64 二、打开一个CMD控制台窗口,设置好openssl.cnf路径 E: cd E:\soft\OpenSSL-Win64\bin set OPENSSL_CONFE:\soft\OpenSSL-Win64\bin\openssl.cnf 三、在当前目录 E:\soft\OpenSSL-Win64\bin 里创建两个子目录 m…

酿酒生产废水处理设备如何选型

选型酿酒生产废水处理设备是确保废水处理过程高效稳定的关键步骤。酿酒生产过程中,产生的废水中含有大量有机物和悬浮物,因此需要选择适合的设备来进行处理。 首先,要根据酿酒生产废水的特点进行选型。酿酒废水的主要特点是:水量较…

phpstorm配置ftp

1 选择设置ftp 2设置自动上传

分享两个概念:非受检异常和受检异常

分享两个概念:非受检异常和受检异常 愿你的每一天都充满阳光和笑声,愿每一步都是轻松与愉快。在新的旅程中,愿你找到勇气攀登高峰,找到智慧化解困境。 愿你的心中充满温暖和善意,愿你的梦想如彩虹般美丽且真实。愿你发…

阿里云ECS服务器安装了数据库,nginx 等,已经启动,但是浏览器,navicat 访问不了

目录 1 问题2 实现 1 问题 阿里云ECS服务器安装了数据库,nginx 等,已经启动,但是浏览器,navicat 访问不了; 防火墙也关闭了,使用命令已经进入数据库了,说明数据库已经安装成功了,但…

Android开发基础(一)

Android开发基础(一) 本篇主要是从Android系统架构理解Android开发。 Android系统架构 Android系统的架构采用了分层的架构,共分为五层,从高到低分别是Android应用层(System Apps)、Android应用框架层&a…

Python实现PDF—>Excel的自动批量转换(附完整代码)

Python实现PDF—>Excel的自动批量转换(附完整代码) 话不多说,先看效果! 需要转换的PDF: 转换后的Excel: 01、底层原理 PDF 到 Excel 的转换涉及不同文件格式之间的数据提取和重构。底层原理可以简…

Flask 菜品管理

common/libs/Helper.py getDictFilterField() 方法 用于在web/templates/food/index.html中展示菜品分类 如何能够通过food里面的cat_id获取分类信息呢?只能通过for循环,这样会很麻烦,所以定义了这个方法。 这个方法可以的查询返回结果…

linux 01 centos镜像下载,服务器,vmware模拟服务器

https://www.bilibili.com/video/BV1pz4y1D73n?p3&vd_source4ba64cb9b5f8c56f1545096dfddf8822 01.使用的版本 国内主要使用的版本是centos 02.centos镜像下载 这里的是centos7 一.阿里云官网地址:https://www.aliyun.com/ 二. -----【文档与社区】 —【…

CSND修改付费专栏价格

人工客服在个人中心右下角可以找到 客服回复已订阅专栏不支持修改价格

师傅带练|在线实习项目,提供实习证明

八大项目:某实习网站招聘信息采集与分析(Python数据采集与分析) 股票价格形态聚类与收益分析(Python金融分析) 某平台网络入侵用户自动识别(Python机器学习) 某平台广东省区采购数据分析&…

Vue项目nginx部署到线上,访问时加前缀解决方案

一、业务场景: 最近项目开发完了,需要部署一个测试版本和正式版本到线上,测试版本前面需要加一个dev前缀,遇到了一些坑,分享给大家 二、目前效果 三、具体实现步骤: (1)实现静态文…

构建安全可靠的系统:第二十一章到附录 A

第二十一章:建立安全和可靠性文化 原文:21. Building a Culture of Security and Reliability 译者:飞龙 协议:CC BY-NC-SA 4.0 作者:Heather Adkins 与 Peter Valchev,Felix Grbert,Ana Oprea…

艾思控AQMD6008BLS-TE无刷电机驱动使用笔记(配合STM32)

一、介绍 本驱动器使用的电机电流精确检测技术、有感无刷电机自测速、有感无刷电机转动位置检测、再生电流恒电流制动(或称刹车)技术和强大的PID调节技术可地控制电机平稳正反转、换向及制动,输出电流实时调控防止过流,精准控制电…

GC2804——GC2803 的升级,12V H桥驱动,8 个NPN达林顿晶体管,采用SSOP24 封装,应用于安防步进电机驱动产品上

GC2804 是 GC2803 的升级,在内部集成了 8 个 NPN 达林顿晶体管连接阵列的基础上,又集成了一路 12V 的 H 桥驱动。8 个 NPN 达林顿阵列用来驱动高压的步进电机,H 桥驱动可以用来驱动 IR-CUT,此芯片专用于安防摄像头系统方案。该 GC…

十分钟部署清华 ChatGLM-6B,实测效果超预期(Linux版)

前段时间,清华公布了中英双语对话模型 ChatGLM-6B,具有60亿的参数,初具问答和对话功能。 最!最!最重要的是它能够支持私有化部署,大部分实验室的服务器基本上都能跑起来。因为条件特殊,实验室网…