docker volume

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,他就不会被删除,如果这个时候执行:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容