docker学习——docker的volumes
目录 什么是volume匿名卷与实名卷如何创建volume-v与-mount的区别数据卷的几种用法什么是volumevolume(卷)用来存储docker持久化的数据,其实就是一个主机上的一个目录,由docker统一管理,我们知道image是只读的,在image运行时,才会加入可写层,虽然我们也可以将数据写入到可写层,但这会增加容器的大小,如果我们不想持久化数据,又...
目录
什么是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可以从另一个容器当中挂载容器中已经创建好的数据卷
更多推荐
所有评论(0)