Docker数据卷与Volume

Docker数据卷和Volume

docker镜像是由一系列的只读层组合而来,当启动一个容器的时候,Docker加载镜像的所有只读层,并在最上层加入一个读写层。这个设计使得docker可以提高镜像构建、存储和分发的效率。但是:

  • 容器中的文件不能在宿主机上方便的对容器中的文件进行访问
  • 多个容器之间的数据无法共享
  • 删除容器的时候容器产生的数据将丢失

为了解决上述问题,docker引入了数据卷Volume机制,volume是存在于一个或者多个容器中的特定文件或文件夹,这个目录以独立于联合文件系统的形式存在于宿主机中,并且为数据的共享和持久化提供便利。

Volume的特点

volume有以下特点

  • volume在创建容器的时候就会初始化,在容器运行时就可以使用其中的文件
  • volume能在不同的容器之间共享和重用
  • 对volume中数据的操作会马上失效
  • 对volume中的数据操作不会影响到镜像本身、
  • volume的生存周期独立于容器的生存周期,即使删除容器,volume仍然会存在,没有任何容器使用的volume也不会被docker删除

Volume的使用

类似于Linux的mount操作,用户将一个文件夹作为volume挂载到容器上,可以很方便的将数据添加到容器中,供其中的进程使用。多个容器可以共享一个volume。

创建volume

docker 在创建volume的时候会在宿主机的/var/lib/docker/volume/中创建一个以volumeID为名的目录,并将volume中的内容存在名为_data的目录下

#创建指定名称的volume
docker volume create --name vol_simple 
#创建随机名称的volume并挂载到容器的/data 目录下 
docker run -d -v /data ubuntu /bin/bash
#创建指定名称的volume并挂载到容器的/data 目录下
docker run -d -v vol_simple: /data ubuntu /bin/bash 
#查看volume包括其在宿主机中该文件夹的位置等信息
docker volume inspect vol_imple

docker 1.9版本引入了新的命令docker volume。但是也保留了-v的传统方式,使用两种方式进行volume的创建。

挂载volume

用户在使用docker run或 docker create创建新容器的时候,可以使用-v 标签为容器添加volume。用户可以自行创建或者由docker创建volume挂载到容器中,也可以将宿主机上的目录或者文件作为volume挂载到容器中。除此之外,用户还可以将单个的文件作为volume挂载到容器中。
将主机上的文件或文件夹作为volume挂载时,可以使用:ro指定该volume为只读
使用docker run 或docker create创建新容器的时候,可以使用多个 -v来为容器挂载多个volume

#创建volume并将创建的volume挂载到容器中的data目录下
docker volume create --name vol_simple
docker run -d -v vol_simple: /data ubuntu /bin/bash
#docker允许我们将宿主机上的目录挂载到容器中
#下面一条命令将宿主机的/host/dir文件夹作为一个volume挂载到容器的/container/dir
#文件夹必须使用绝对路径,如果宿主机中不存在/host/dir将创建一个空的文件夹
#在/host/dir文件夹中的所有文件或文件夹可以在容器的/container/dir文件下被访问
#如果镜像中原本存在/container/dir文件夹,该文件夹下的内容将被隐藏,以保持与宿主机中的文件夹一致
docker run -v /host/dir:/container/dir ubuntu /bin/bash
#将单个文件作为volume挂载到容器中
docker run -it --name vol_file -v /host/file:/container/file ubuntu /bin/bash
#将volume设置为只读
docker run -it -name vol_unshared -v /host/dir:/container/dir:ro ubuntu /bin/bash

dockerfile添加volume

在dockerfile中使用 VOLUME指令向容器添加volume

#dockerfile中添加volume
VOLUME /data
#dockerfile中添加多个volume
VOLUME ["/data1","/data2"]

使用docker build的时候会挂载一个volume到/data。为了保证dockerfile的可移植性,VOLUME指令不能挂载主机中指定的文件夹。

共享volume

在使用docker run 或 docker create创建新容器时,可以使用–volumes-from标签使得容器与已有的容器共享volume

#新创建的容器vol_use与之前创建的容器vol_simple共享volume,这个volume目的目录也是/data
#可以使用多个--volumes-from标签,使得容器与多个已有容器共享volume
docker run -rm -it --name vol_use --volumes-from vol_simple ubuntu /bin/bash

删除volume

创建容器的时候从容器中挂载了volume,在/var/lib/docker/volumes下回=生成与volume对应的目录,使用docker rm删除容器的时候并不会善于与volume对应的目录。
所以我们希望在删除容器的时候一并删除掉volume

docker volume rm <volume_name> #删除volume
docker rm -v <container_name> #删除容器
doccker run --rm #--rm标签会在容器停止运行时删除容器以及容器所挂载的volume

docker volume删除volume的时候,只有当没有任何容器使用该volume的时候,该volume才能成功删除。
另外两种方式,只会对挂载在该容器上的未命名的volume进行删除,而会对用户指定名字的volume进行保留。
如果volume是在创建容器的时候从宿主机挂载的,无论对容器进行任何操作都不会导致其在宿主机中被删除,如果不需要这些文件,只能手动删除。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值