Volume数据卷的由来:

Docker镜像是由多个文件系统(只读层)叠加而成。当我们启动一个容器的时候,Docker会加载只读镜像层并在其上添加一个读写层。如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏。当删除Docker容器,并通过该镜像重新启动时,之前的更改将会丢失。在Docker中,只读层及在顶部的读写层的组合被称为Union File System(联合文件系统)。

为了能够保存(持久化)数据以及共享容器间的数据,Docker提出了Volume的概念。

简单来说,Volume就是目录或者文件,它可以绕过默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上。

特点:

one、数据卷可以在容器间共享和重用数据。

two、数据卷可以在宿主和容器间共享数据。

three、数据卷数据可以直接修改。

four、数据卷是持续性的,直到没有容器使用它们。

等等。

补充:

容器在运行期间产生的数据是不会写在镜像里面的,重新用此镜像启动新的容器就会初始化镜像,会加一个全新的读写入层来保存数据。

关于Docker数据持久化:

one、Docker提供数据卷或者数据容器卷。

two、通过commit提交一个新的镜像来保存产生的数据。

1、创建数据卷

1.1、在家目录Dokcer下创建目录volume/data

mkdir volume/data -p

以centos的image为例:

1.2、启动容器

docker run -it -v /home/odysee/Docker/volume/data centos bash

-it:

-i: 以交互模式运行容器,通常与-t同时使用。

-t: 为容器重新分配一个伪输入终端,通常与-i同时使用。

/home/odysee/Docker/volume/data:容器会自动创建该目录

1.3、在容器内data下touch一个文件

echo 'call me volume!' > volFile

1.4、在查看宿主机查看数据卷对应的目录

新开一个终端

docker ps:查看运行的容器。

docker inspect containerid:获取容器的元数据。

查找Mounts 对象的JSON数据

"Source": "/var/lib/docker/volumes/cc7b696a836c284bf3941a58eb53168c86b2a9697c7cafa82693c922ed510459/_data"

这就是对应我们宿主机的目录

1.5在宿主机内查看volFile文件

在下面追加一行

1.6、到容器中查看volFile文件

如下图,已经更新

2、 挂载宿主机文件/目录到容器数据卷

可以直接挂载宿主机文件或目录到容器里,可以理解为目录映射,这样就可以让所有的容器共享宿主机数据,从而只需要改变宿主机的数据源就能够影响到所有的容器数据。

注意:

one:-v后面的映射关系是。

two:宿主机上的文件/目录是要提前存在的,容器里对应的文件/目录会自动创建。

2.1、创建挂载目录

在家目录的Dokcer下创建目录tmp/vol/tmpFile文件

echo 'I am a file!'>tmpFile

2.2、启动容器

docker run -it -v /home/odysee/Docker/tmp/vol:/tmp/vol centos bash

在容器内查看tmpFile文件

在tmpFile文件中追加一行

2.3、在宿主机中查看tmpFile文件

3、 创建数据卷容器

3.1、创建数据卷目录volume

3.2、启动容器A_Container

docker run -it -v /tmp/volume --name A_Container centos bash

-it:

-i: 以交互模式运行容器,通常与-t同时使用。

-t: 为容器重新分配一个伪输入终端,通常与-i同时使用。

--name:为容器指定一个名称。

/tmp/volume:容器会自动创建该目录。

在volume中创建一个文件

3.3、查看宿主机上与数据卷对应的目录路径

新开一个终端

docker ps:查看运行容器id。

docker inspect containerid:获取容器的元数据。

查找Mounts 对象的JSON数据

"Source": "/var/lib/docker/volumes/30021380d4b6ebdfb92fcce1b7478528a43ac9796056252a78ff79df5935d4f9/_data"

这就是对应我们宿主机的目录

查看一下宿主机中文件

3.4、创建B_Container容器,挂载A_Container容器中的数据卷

docker run -it --volumes-from A_Container --name B_Container centos bash

-it:

-i: 以交互模式运行容器,通常与-t同时使用。

-t: 为容器重新分配一个伪输入终端,通常与-i同时使用。

--volumes-from:挂载A_Container容器中的数据卷。

--name:为容器指定一个名称。

建议多开几个终端

如下图

B_Container容器已经挂载了A_Container容器中的数据卷

docker ps

3.5、创建C_Container容器,挂载A_Container/B_Container[皆可]容器中的数据卷

docker run -it --volumes-from A_Container --name C_Container centos bash

docker ps

3.6、补充

删除了初始的数据卷容器A_Container,或是删除了B_Container等等其它容器。

只要是有容器使用该数据卷,那么它里面的数据就不会丢失。

4、 删除数据卷

/var/lib/docker/volumes目录中存在数据卷的遗留目录。

删除方法:

One:docker rm -v

remove容器时添加了-v选项。

Two:

docker run --rm

运行容器时添加了--rm选项。

4.1、测试方法one[方法two不做操作]

启动一个容器

docker run -d -v tmp/volume centos bash

查看容器volume的name

docker inspect 3e3c71453ea497

找到Mounts

"Name": "16289588bf94e8aa53d0ff0a138380d34ee87e42f54926cfbb0762a82827e59a"

查看volume:

docker volume ls

发现了刚刚挂载的volume的name

如下图:宿主机中有很多容器volume遗留的产物

删除数据卷:

docker rm -vf 3e3c71453ea4

-f:通过SIGKILL信号强制删除一个运行中的容器。

-v:删除与容器关联的卷。

16289588bf94e8aa53d0ff0a138380d34ee87e42f54926cfbb0762a82827e59a:

在宿主机中此volume已经被delete

5、备份数据卷

docker run -it --rm --volumes-from one_Container

-v $(pwd):/backup centos

tar cvf /backup/backup.tar /var/volume

命令解释:

1、启动一个新的容器从one_Container容器中挂载数据卷

2、挂载当前目录[$(pwd)]到容器中的backup

3、备份/var/volume卷中所有的数据为backup.tar

4、执行完成之后删除容器数据卷

5、备份就在当前的目录[$(pwd)]下,名为backup.tar

注意:后面的/var/volume是数据卷的目录路径。

案例:

5.1、创建一个容器one_Container并且创建一个数据卷/var/volume

docker run -it -v /var/volume --name one_Container centos bash

在容器内volume/创建一个文件volumeFile

5.2、备份容器one_Container数据卷/var/volume

docker run -it --rm --volumes-from one_Container

-v $(pwd):/backup centos

tar cvf /backup/backup.tar /var/volume

如下图:

备份成功

解压并查看volumeFile文件

测试完成。

欢迎大家给予宝贵的意见或者建议。

欢迎大家补充或者共享一些其他的方法。

感谢支持。

docker -v 挂载文件_浅谈关于docker中数据卷的操作,附带案例相关推荐

  1. java 定时任务怎么关闭_浅谈springboot项目中定时任务如何优雅退出

    在一个springboot项目中需要跑定时任务处理批数据时,突然有个Kill命令或者一个Ctrl+C的命令,此时我们需要当批数据处理完毕后才允许定时任务关闭,也就是当定时任务结束时才允许Kill命令生 ...

  2. mysql declare与set的区别_浅谈MySQL存储过程中declare和set定义变量的区别

    在存储过程中常看到declare定义的变量和@set定义的变量.简单的来说,declare定义的类似是局部变量,@set定义的类似全局变量. 1.declare定义的变量类似java类中的局部变量,仅 ...

  3. python中判断列表数据类型_浅谈Python数据类型判断及列表脚本操作

    数据类型判断 在python(版本3.0以上)使用变量,并进行值比较时.有时候会出现以下错误: TypeError: unorderable types: NoneType() < int() ...

  4. python列表使用判断_浅谈Python数据类型判断及列表脚本操作

    数据类型判断 在python(版本3.0以上)使用变量,并进行值比较时.有时候会出现以下错误: TypeError: unorderable types: NoneType() < int() ...

  5. python中if和elif的区别_浅谈对python中if、elif、else的误解

    今天下午在练习python时用了"if...if...else..."的分支结构,结果运行出来吓我一跳.原来我想当然的认为"if...if...else..." ...

  6. python中分支语句elif与else的区别_浅谈对python中if、elif、else的误解

    今天下午在练习python时用了"if...if...else..."的分支结构,结果运行出来吓我一跳.原来我想当然的认为"if...if...else..." ...

  7. java扫码枪键盘_浅谈在react中如何实现扫码枪输入

    触发原理 原理就是监听键盘输入,比如扫一个为6970596130126的69条形码,用扫码枪扫一下会在光标位置依次输出: 6 9 7 0 5 9 6 1 3 0 2 6 但这不是完整的,所以需要写一个 ...

  8. mysql存储过程set什么意思_浅谈MySQL存储过程中declare和set定义变量的区别

    在存储过程中常看到declare定义的变量和@set定义的变量.简单的来说,declare定义的类似是局部变量,@set定义的类似全局变量. 1.declare定义的变量类似java类中的局部变量,仅 ...

  9. docker -v 覆盖了容器中的文件_浅谈docker中宿主机和容器之间互相copy文件的两种方式,欢迎补充...

    在dokcer的日常使用过程中,我们可能会遇到将宿主机内文件/目录copy到容器内,或者将容器的文件/目录copy到宿主机中,下面我们就来简单的谈一下关于这种情况的两种操作. 1.Docker cp命 ...

最新文章

  1. scrum 敏捷开发
  2. Android 开源框架Universal-Image-Loader完全解析(一)--- 基本介绍及使用
  3. 笨方法学python--变量和命名
  4. mac命令行安装htop
  5. long long , __int64 范围
  6. 《云计算核心技术剖析》mini书
  7. Win10下OMNeT 5.X 遇到Simulating tictoc-tictoc1-“ has encountereda problemFinished with Error问题
  8. U盘弹出问题解决尝试和记录
  9. 学硕计算机可考大数据博士吗,专硕考博比学硕考博难度更大吗?听听上岸的人怎么说...
  10. 计算机英语单词怎么巧背,巧计英语单词的26个秘诀
  11. java统计误码率_MATLAB通信工具箱来计算误码率
  12. CSS的前景色和背景色,高度和宽度,字体属性,文本阴影,抖音字体
  13. 2016秋招面经(蘑菇街+BT+网易杭研+CVTE+唯品会)
  14. docker compose容器域名配置
  15. 用python生成excel文件_python通过openpyxl生成Excel文件的方法
  16. 分享一个开源的QT的串口示波器
  17. 《模型思维》—— 斯科特.佩奇
  18. 【CTF】java反序列-2020-网鼎杯-朱雀组-Web-think_java
  19. python三维坐标轴单位长度_Matplotlib中三维散点图的z轴缩放和限制
  20. 均线粘合突破选股指标公式:寻找启动点,并进行信号过滤

热门文章

  1. 探探发布春节短片《慢慢来》 两代人隔空对话催婚问题
  2. 扎克伯格不要「脸」了?Facebook正式更名为“Meta”
  3. 千元满血续航王!iQOO Z5发布 售价1799元起
  4. 马云无偿划转阿里股权?蚂蚁集团回应:假消息
  5. 曝Redmi Note 9系列下周发布:最便宜的一亿像素手机
  6. 苹果阻止《堡垒之夜:拯救世界》Mac版更新
  7. 为iPhone 12上市做准备,台积电月底前投产A14 Bionic芯片
  8. 得物App联合Zippo推出限量款打火机 首批开售十分钟即售罄
  9. 苹果5G手机因疫情影响 或将推迟至10月发布
  10. 外卖员不满上楼送餐要求向外卖吐口水4次,顾客不知情吃下整份外卖...