docker的volumes

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

匿名卷与实名卷
匿名卷即没有显示指定名字的卷,实名卷具有名字,两种卷均存储在/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可以从另一个容器当中挂载容器中已经创建好的数据卷
————————————————
版权声明:本文为CSDN博主「菜到怀疑人生」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/dhaiuda/article/details/82842873

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值