深入理解Docker Volume(二)

  一开始,认为Volume是用来持久化的,但是这实际上不对,因为认为Volume是用来持久化的同学一定是认为容器无法持久化,所以有了Volume来帮助容器持久化,事实上,容器会一直存在,除非你删除他们.

   容器是持久的,直到你删除他们,并且你只能这么做:

 
  1. $docker rm my_contariner  

如果你没有执行此命令,那么你的容器会一直存在,依旧可以启动,停止等.如果你找不到容器,可以运行

 
  1. $docker ps -a  

Docker ps只能显示正在运行的容器,但是容器也会处于停止状态,这种情况下,上面的命令会显示所有的容器,无论他们处于什么状态.docker run...命令可以有很多的组合(它提供了Docker容器从创建到启动的所有功能),它会创建一个新的容器,然后启动它.

所以说,Volume不是为了持久化.

什么是Voume

Volume可以将容器以及容器缠身的数据分离开来,这样的话,当你使用docker rm my_container删除容器时,不会影响相关的数据.

Volume可以使用下面两种方式创建:

1.在Dockerfile指定VOLUME /some/dir

2.执行docker run -v /some/dir命令指定

无论哪种方式都是做了同样的事情.他们告诉Docker在主机上创建一个目录(默认情况下是在/var/lib/docker),然后将其挂载到指定的路径(本例中是:/some/dir).当删除使用该Volume的容器时,Volume本身不会受到影响,它可以一直存在下去.

如果在容器中不存在指定的目录,那么该目录将会被自动创建.

你可以告诉Docker同时删除容器和Volume:

  1. $docker rm -v my_container 

有时候,你想在容器中使用主机上的某个目录,你可以通过其他的参数来指定:

  1. $docker run -v /host/path:/some/path...  

这就明确的告诉Docker使用指定的主机路径来代替Docker床架你的根路径并挂载到容器内指定的路径(上例中是/some/dir).需要注意的是,这种方式同样支持问文件.在Docker术语中,这通常被称为bind-mounts.如果主机上的路径不存在,目录将自动在给定的路径中创建.

容器也可以与其他容器共享Volume:

  1. $docker run --name my_container -v /some/path ...  
  2.    
  3. $docker run --volumes-from my_container --name my_contaner2 ...  
 上面你的案例将告诉Docker从第一个容器挂载相同的Volume到第二个容器,它可以在两个容器之间共享数据.

如果你执行docker rm -v my_container命令,而上面的第二容器依然存在,那Volume就不会删除,如果你不使用docker rm -v my_container2删除第二个容器,那么这个Volume就是一直存在.

继续补充,因为VOLUME实际上就是在本地新建了一个文件夹挂载了,那么实际上容器内部的文件夹有三种情况:
1、没有指定VOLUME也没有指定-v,这种是普通文件夹。
2、指定了VOLUME没有指定-v,这种文件夹可以在不同容器之间共享,但是无法在本地修改。
3、指定了-v的文件夹,这种文件夹可以在不同容器之间共享,且可以在本地修改。

posted on 2017-03-24 23:19  ilinux_one  阅读(1590)  评论(0编辑  收藏  举报

导航