我们现在知道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都可以看到。