深入理解Docker Volume()

 

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

 

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

$docker rm my_contariner


 

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

$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:

$docker rm -v my_container


 

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

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


 

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

 

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

$docker run --name my_container -v /some/path ...
 
$docker run --volumes-from my_container --name my_contaner2 ...

 

上面你的案例将告诉Docker从第一个容器挂载相同的Volume到第二个容器,它可以在两个容器之间共享数据.

 

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


Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐