目录

 

什么是volume

匿名卷与实名卷

如何创建volume

-v与-mount的区别

数据卷的几种用法


什么是volume

volume(卷)用来存储docker持久化的数据,其实就是一个主机上的一个目录,由docker统一管理,我们知道image是只读的,在image运行时,才会加入可写层,虽然我们也可以将数据写入到可写层,但这会增加容器的大小,如果我们不想持久化数据,又不想将数据暂存在docker的可写层,可以考虑使用 tmpfs mount(以后在总结),我对volume的理解就是将主机上的一个文件映射到容器当中的某个文件,容器向其中写入数据就相当于向主机中对应的文件写入数据,官方有一幅图描述tmpfs mount与volume的不同:

volumes on the Docker host

 

匿名卷与实名卷

匿名卷即没有显示指定名字的卷,实名卷具有名字,两种卷均存储在/var/lib/docker/volumes/区域,匿名卷的目录名是一串数字,如果在创建容器是添加了-rm参数,则匿名卷会随着容器的删除而删除,其实匿名卷和实名卷基本可以看成是一个东西,只是匿名卷名字由docker随机命名,并且可以随容器的销毁而销毁而已

 

如何创建volume

有两种方式:
#用于为单一容器创建数据卷
docker run -v.....

#用于为集群服务创建数据卷
docker run -mount.....

高于17.06的docker可以将--mount用于为单一容器创建数据卷,两者的差别如下:

1、-v或是-volume包括三个区域,以分号分割

  • 第一个区域用于定义卷的名称,如果不指定,表明使用匿名卷,实名卷的名称在一台主机上唯一
  • 第二个区域指定卷对应容器中的哪个文件
  • 第三个区域是可选的,是用逗号分割的选项列表

 

2、-mount使用键值对<key>=<value>,以逗号分割,对应的值如下

  • type:可以是bind、volume、tmpfs,创建数据卷使用volume
  • source:挂载点的名字,对于实名卷,为实名卷的名字,匿名卷不需要使用这个关键字
  • destination:指定卷对应容器中的哪个文件
  • readonly:指定数据卷只可读
  • volume-opt:可以出现多次,其值为一个键值对(有什么用我还不知道)

如果volume-opt中关键字对应的值出现volume-opt,需要让docker识别出这个volume-opt是一个值,如何做?

-mount参数的值用单引号包含起来,将关键字对应值中出现的volume-opt用双引号括起来,如下:

$ docker service create \
     --mount 'type=volume,src=<VOLUME-NAME>,dst=<CONTAINER-PATH>,volume-driver=local,volume-opt=type=nfs,volume-opt=device=<nfs-server>:<nfs-path>,"volume-opt=o=addr=<nfs-address>,vers=4,soft,timeo=180,bg,tcp,rw"'
    --name myservice \
    <IMAGE>

 

-v与-mount的区别

-mount可以支持创建集群服务的数据卷,而-v不行,其余基本没差

 

数据卷的几种用法

接下来文档介绍了数据卷的几种用法,在这里总结下,方便以后查阅

1、创建、查看、删除数据卷:

可以在没有任何容器的前提下创建数据卷

创建实名数据卷
docker volume create my-vol

创建匿名卷
docker volume create

查看数据卷列表
docker volume ls

查看具体的数据卷
docker volume inspect my-vol

删除数据卷
docker volume rm my-vol 

 

2、在创建容器时指定数据卷

#使用-mount创建实名卷
$ docker run -d \
  --name devtest \
  --mount source=myvol2,target=/app \
  nginx:latest

#使用-v创建实名卷
$ docker run -d \
  --name devtest \
  -v myvol2:/app \
  nginx:latest

 

3、在创建集群服务时指定数据卷

$ docker service create -d \
  --replicas=4 \
  --name devtest-service \
  --mount source=myvol2,target=/app \
  nginx:latest

 

4、填充数据卷

如果容器中用于映射的文件或目录不为空,则其中的数据或是文件会拷贝到数据卷中

 

5、使用只读数据卷

多个容器可以挂载在同一个数据卷上,我们可以设置某个容器对数据卷只有读权限,设置方式如下:

#ro表示只读(readonly)
$ docker run -d \
  --name=nginxtest \
  -v nginx-vol:/usr/share/nginx/html:ro \
  nginx:latest

$ docker run -d \
  --name=nginxtest \
  --mount source=nginx-vol,destination=/usr/share/nginx/html,readonly \
  nginx:latest

 

6、在多台机器上共享一个数据卷

文档原文如下:

总结一下:

1、在应用程序中添加代码逻辑,从云存储上读写数据

2、使用支持写数据到云存储的volume驱动,并使用该驱动创建数据卷(至于数据卷驱动是啥,以后用到再说)

 

7、下载数据卷驱动以及使用数据卷驱动创建数据卷

#下载vieux/sshfs驱动
$ docker plugin install --grant-all-permissions vieux/sshfs

#使用特定的驱动创建数据卷(-driver)
$ docker volume create --driver vieux/sshfs \
  -o sshcmd=test@node2:/home/test \
  -o password=testpassword \
  sshvolume

#创建容器时使用特定驱动创建数据卷(-volume-driver)
$ docker run -d \
  --name sshfs-container \
  --volume-driver vieux/sshfs \
  --mount src=sshvolume,target=/app,volume-opt=sshcmd=test@node2:/home/test,volume-opt=password=testpassword \
  nginx:latest

 

8、移除数据卷(与之前的部分有重复)

(1)移除匿名卷

#-rm:删除容器时会删除容器对应的匿名卷,拿下面的例子来说,删除busybox容器时,会删除/foo对应的匿名卷,但是不会删除awesome
$ docker run --rm -v /foo -v awesome:/bar busybox top

(2)根据名字移除卷

docker volume rm awesome

(3)移除所有数据卷

$ docker volume prune

docker规定,没有容器正在使用数据卷后才允许删除该数据卷

 

9、其他

volume-from可以从另一个容器当中挂载容器中已经创建好的数据卷

Logo

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

更多推荐