centos7下安装docker(13.1docker存储--data volume)

我们现在知道docker 有两种存储方式:storage driver和data volume

stroage driver这种存储方式主要是存储那些无状态的数据,是镜像层和容器层组成的,而data volume是目录或者文件,那么这些目录或者文件要设置多大呢?

     因为volume实际上是docker host文件系统的一部分,所以volume的容量取决于文件系统当前未使用的空间,目前还没有方法设置volume的容量

 

 

在具体的使用上,docker提供了两种类型的volume:bind mount和docker managed volume

bind mount:

是将host上已存在的目录或者文件mount 到容器,通过-v将其mout到容器中

 

-v:格式为:<host path>:<container path>

如果挂载点mount point已经存在,那么会将原有的数据隐藏起来,如果mount point不存在,那么会自动创建一个挂载点,同样,如果host中的原文件如果不存在,会被当作新的目录bind mount给容器,这与linux中的mount性质一致。

出现这个错误的原因是由于我的~/htdocs是一个文件,而/usr/local/apache2/htdocs是一个目录,所以导致我不能挂载成功,我的容器也只能处于create的状态,

说明:当我们使用bind mount去给容器挂载的时候,一定要一一对应,文件只能挂载到文件上,不能挂载到目录上,目录只能挂载到目录上,不能挂载到文件上

 

 

由于/usr/local/apache2/htdocs十一个挂载点,那当我们更新host上面的/root/htdocs/index.html时,挂载点的内容是否会变?

根据试验的结果证明:当我们更改host上的bind mount中的内容时,容器中的相应的挂载点也会被改变,说明bind mount可以让host与容器实现数据共享

当我们将容器销毁时,bind mount是否存在?

可见即使我们删除了容器,bind mount依然存在。因为bind mount是host上面的文件,只是借给容器使用,不能说删就删

 

bind mount时还可以指定数据的读写权限,默认是可写可读,可指定为只读

ro:设置了只读权限,在容器中无法对bind mount数据进行修改,只有host有权限修改数据,提高了安全性

 

 

mount point有很多应用场景,比如我们可以将源代码目录mount到容器中,在host中修改代码就能看到应用的实时效果。再比如将mysql容器的数据放在bind mount里,这样host可以方便的备份和迁移。

bind mount的使用直观高效,易于理解,但它也有不足的地方:bind mount需要指定host文件系统的特定路径,这就限制了容器的可移植性,当需要将容器迁移到其他host,而该host没有要mount的数据或者数据不在想通的路径时,操作会失败

 

 

移植性更好的方式是:docker managed

docker managed volume与bind mount在使用上的最大的区别就是不需要指定mount源,指明mount point就行了。

我们指定了容器的挂载点,但是这个host上的源文件在那呢?

可以在host上通过docker inspect查看挂载的内容

docker inspect输出很多,但是我们现在只关心mount的内容:

Source:就是volume在host上的位置

Destination:我们指定的mount point

每当容器申请mount docker managed volume时,docker 都会在/var/lib/docker/volume下生成一个目录

这个目录就是mount 源

 

 那这个volume中到底有什么呢?

volume的内容跟原有/usr/local/apache2/htdocs完全一样,说明在指定mount point时会自动复制一份原有数据到volume中

 

但是:此时的/usr/local/apache2/htdocs已经不在由storage driver管理了,他已经是一个data volume。我们可以想bind mount一样对数据进行操作,例如更新数据

 

看一下容器里的数据是否会更新:

容器中的内容已经被更新!

我们是够能更改mount point的权限呢?

试验结果是:不能,只能是可读可写的权限,不能想bind mount那样设置权限

 

我们来回顾一下docker managed volume的创建过程:

1.容器启动的时候,简单的告诉docker“我需要一个volume存放数据”,帮我mount到容器的/abc中;

2.docker在host中的/var/lib/docker/volumes中生成一个随机的目录作为mount源;

3.如果容器中的/abcy已经存在,则复制数据到mount源中;

4.将host中的volume mount到/abc

我们除了用docker inspect可以查看volume的信息,还可以通过docker volume查看docker managed volume,但不能看到bind mount的信息;docker inspect都可以看到。

 

 

 


  

posted @ 2017-10-29 18:01  无踪无影  阅读(413)  评论(0编辑  收藏  举报