docker之volumn

https://mp.weixin.qq.com/s/Bv9ngMpw3DYLXghLTBQ00Q
在使用docker的过程中,必然会遇到数据管理的问题,那么数据的持久化是必须要了解的。

so,在容器中如何管理数据呢?

数据卷(Data Volumes)、bind mount和数据卷容器,说到底可以看做数据卷的应用。

第一种:数据卷

什么是数据卷呢?

volume也是绕过container的文件系统,直接将数据写到host机器上,只是volume是被docker管理的,docker下所有的volume都在host机器上的指定目录下/var/lib/docker/volumes。
可以这么理解:容器中数据会直接映射到宿主机环境(数据卷可以看做一个特殊目录,将主机操作目录直接映射进容器,类似于linux中德 mount)。
数据卷有以下特性:

数据卷可以在容器之间共享和重用,容器间传递数据将变得高效方便;

对数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作;

对数据卷的更新不会影响镜像,解耦了应用和数据;

卷会一直存在,直到没有容器使用,可以安全地卸载它。

如何创建一个数据卷?

在镜像构建完成后,运行一个容器时,使用以下命令

sudo docker run -itd --name test:/testc --rm -v testv image_name

在上述命令中,-v 承担着创建一个数据卷的任务,下面我们实际操作看一下:在这里插入图片描述

这是笔者自己现有的镜像,就随便使用一个以作演示。

创建容器在这里插入图片描述查看数据卷,如下图是宿主机上的卷
在这里插入图片描述

容器中:
在这里插入图片描述

test下是空,如果是在容器中新建一个文件,会对他有什么影响呢?来试一试

容器中:
在这里插入图片描述

宿主机:
在这里插入图片描述

现在,我们知道了在容器内建一个数据卷会在宿主机上有一个相对应的映射,那么如果这时候stop容器会有什么效果。本次创建container的时候用到了–rm -it 没有用到-d,这就说明我们exit容器后会stop容器并且会rm container,所以我们只需exit即可,这时候再看宿主机上的文件依然存在。

第二种:bind mount

bind mount用于将host机器的目录mount

docker run -it -v /testv:/testv image_name

到container中。但是bind mount在不同的宿主机系统时不可移植的,不同系统的文件系统不同,如Windows和Linux的目录结构是不一样的,bind mount所指向的host目录也不能一样。这也是为什么bind mount不能出现在Dockerfile。

注意:

host机器的目录路径必须为全路径(准确的说需要以/或~/开始的路径)

host机器上的目录不存在,docker会自动创建

container中的目录不存在,docker会自动创建

host机器目录无论有没文件,都会覆盖container挂载目录

dockerfile中:

VOLUME /testv

docker运行时,docker会创建一个匿名的volume,并将此volume绑定到container的/testv目录中,如果container的/testv目录下已经有内容,则会将内容copy到volume中。效果上:

VOLUME /testv

docker run -v /testv image_name

的一样。

Dockerfile中的VOLUME使每次运行一个新的container时,都会为其自动创建一个匿名的volume,如果需要在不同container之间共享数据,那么我们依然需要通过下面语句将/testv中数据存放于指定的volume-v中。

docker run -it -v volume-v:/testv imagename

第三种:数据卷容器

在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器也是一个容器,但是它的目的是专门用来提供数据卷供其他容器挂载。

首先,创建一个数据卷容器testdata,创建一个数据卷

sudo docker -it --name testdata -v /testdata imagename

这种写法在第二种方法里有说,暂不赘述。

其他容器要使用此数据卷使用以下命令:

sudo docker run -it --volumes-from testdata --name test1 imagename
sudo docker run -it --volumes-from testdata --name test2 imagename
sudo docker run -it --volumes-from testdata --name test3 imagename

执行完毕,匿名卷已映射在三个容器中的/testdata下,共享此volumn。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值