目录
什么是volume
匿名卷与实名卷
如何创建volume
-v与-mount的区别
数据卷的几种用法
volume(卷)用来存储docker持久化的数据,其实就是一个主机上的一个目录,由docker统一管理,我们知道image是只读的,在image运行时,才会加入可写层,虽然我们也可以将数据写入到可写层,但这会增加容器的大小,如果我们不想持久化数据,又不想将数据暂存在docker的可写层,可以考虑使用 tmpfs mount(以后在总结),我对volume的理解就是将主机上的一个文件映射到容器当中的某个文件,容器向其中写入数据就相当于向主机中对应的文件写入数据,官方有一幅图描述tmpfs mount与volume的不同:
匿名卷即没有显示指定名字的卷,实名卷具有名字,两种卷均存储在/var/lib/docker/volumes/区域,匿名卷的目录名是一串数字,如果在创建容器是添加了-rm参数,则匿名卷会随着容器的删除而删除,其实匿名卷和实名卷基本可以看成是一个东西,只是匿名卷名字由docker随机命名,并且可以随容器的销毁而销毁而已
有两种方式:
#用于为单一容器创建数据卷
docker run -v.....
#用于为集群服务创建数据卷
docker run -mount.....
高于17.06的docker可以将--mount用于为单一容器创建数据卷,两者的差别如下:
1、-v或是-volume包括三个区域,以分号分割
2、-mount使用键值对
如果volume-opt中关键字对应的值出现volume-opt,需要让docker识别出这个volume-opt是一个值,如何做?
-mount参数的值用单引号包含起来,将关键字对应值中出现的volume-opt用双引号括起来,如下:
$ docker service create \
--mount 'type=volume,src=,dst=,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:,"volume-opt=o=addr=,vers=4,soft,timeo=180,bg,tcp,rw"'
--name myservice \
-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可以从另一个容器当中挂载容器中已经创建好的数据卷