VOLUME场景需求:
1)容器是基于镜像创建的,最后的容器文件系统包括镜像的只读层+可写层,容器中的进程操作的数据持久化都是保存在容器的可写层上。一旦容器删除后,这些数据就没了,除非我们人工备份下来(或者基于容器创建新的镜像)。能否可以让容器进程持久化的数据保存在主机上呢?这样即使容器删除了,数据还在。
2)当我们在开发一个web应用时,开发环境是在主机本地,但运行测试环境是放在docker容器上。这样的话,我在主机上修改文件(如html,js等)后,需要再同步到容器中。这显然比较麻烦。
3)多个容器运行一组相关联的服务,如果他们要共享一些数据怎么办?
对于这些问题,我们当然能想到各种解决方案。而docker本身提供了一种机制,可以将主机上的某个目录与容器的某个目录(称为挂载点、或者叫卷)关联起来,容器上的挂载点下的内容就是主机的这个目录下的内容,这类似linux系统下mount的机制。 这样的话,我们修改主机上该目录的内容时,不需要同步容器,对容器来说是立即生效的。 挂载点可以让多个容器共享。也就是说Volume可以将容器以及容器自身的数据分离开来,这样的话,当你使用docker rmmy_container删除容器时,不会影响相关的数据。
命令:
docker volume create用法:docker volume create [OPTIONS] [VOLUME]
创建一个卷-d, --driver指定卷驱动程序名称默认local
--label设置卷的元数据
-o, --opt设置驱动程序的具体选项
docker volume inspect用法:docker volume inspect [OPTIONS] VOLUME [VOLUME...]
显示一个或多个卷的详细信息-f,--format使用给定的Go模板格式化输出
docker volume ls用法:docker volume ls [OPTIONS]
列出卷-f,--filter提供过滤值(例如’dangling=true’)
--format使用Go模板打印输出卷
-q,--quiet只显示卷名称(默认false)
过滤标志(-f或--filter)格式是“key = value”。如果有多个过滤器,则传递多个标志(例如,--filter "foo=bar" --filter "bif=baz")
dangling过滤所有未由任何容器引用的卷
driver过滤卷上的驱动程序名称的全部或部分匹配
LABEL(标签)
label过滤是匹配基础上存在独立的量或值 如下图:
示例:docker volume ls --filter label=cc-date
与标签cc-date进行匹配,而不管其值如何。
NAME名称匹配过滤,是卷的名称全部或部分匹配。
只显示未由任何容器引用卷的名称,如下图:
Go模板的有效占位符如下所示:
.Name网络名字
.Driver网络驱动
.Scope网络范围(本地,全球)
.Mountpoint网络是否为内部、内部挂载点
.Labels分配给卷的所有标签
.Label此卷特定的标签值,例如{{.Label "project.version"}}
docker volume prune用法:docker volume prune [OPTIONS]
修改卷-f,--force不需提示确认
(删除所有未使用的卷)
docker volume rm用法:docker volume rm[OPTIONS] VOLUME [VOLUME...]
删除一个或多个卷-f,--force强制删除一个或多个卷
注意:不能删除容器正在使用的卷。
Volume可以使用下面两种方式创建:
1.在Dockerfile指定VOLUME /some/dir
2.执行docker run -v /some/dir命令指定
创建一个名为volname的数据卷,通过-v参数可以进行创建,同时也可以通过docker volume create来创建。
上面的命令会将/data挂载到容器中,并绕过联合文件系统,我可以在主机上直接操作该目录。
Docker把在/var/lib/docker下的某个目录挂载到了容器内的/data目录下。如果主机上的路径不存在,目录将自动在给定的路径中创建。
也可以直接在主机此文件夹下进行操作:
只要将主机的目录挂载到容器的目录上,那改变就会立即生效.我们可以在Dockerfile中通过使用VOLUME指令来达到相同的目的:
还有另一件只有-v参数能够做到而Dockerfile是做不到的事情就是在容器上挂载指定的主机目录.例如:
这是将宿主机的/tcc/shell目录挂在到容器上的/date/shell目录上。任何在/tcc/shell目录下的文件都会出现在容器内。这对于在主机和容器之间共享文件是很方便、有用的。
为了保证可移植性,挂载主机目录不需要从Dockerfile指定.当使用-v参数时,镜像目录下的任何文件都不会被复制到Volume中.
如果要授权一个容器访问另一个容器的Volume,我们可以使用-volumes-from参数来执行docker run
注意:如果现在停止cc-test,它仍然会启作用,只要有容器连接Volume,他就不会被删除,如果这个时候执行: