Docker 数据管理Named volume详解
Docker数据管理:Namedvolume
Docker中可以使用Namedvolume和datacontainer来进行数据的管理。
单一Container的使用Helloworld
Step1:创建一个NamedVolume
事前确认volume的信息,没有VOLUME存在
[root@host88volumes]#dockervolumels DRIVERVOLUMENAME [root@host88volumes]#
确认/var/lib/docker/volumes的状况
[root@host88volumes]#pwd /var/lib/docker/volumes [root@host88volumes]#ll total0 [root@host88volumes]#
创建一个名为volname的数据卷,通过-v参数可以进行创建,同时也可以通过dockervolumecreate来创建。
[root@host88volumes]#dockerrun-it-vvolname:/volumedata/dbdatadebian root@b2e3523a6dd9:/#cdvolumedata/dbdata root@b2e3523a6dd9:/volumedata/dbdata#ls-l total0 root@b2e3523a6dd9:/volumedata/dbdata#
在Container外部确认此事volname是否已经创建成功
[root@host88volumes]#dockervolumels DRIVERVOLUMENAME localvolname [root@host88volumes]#
确认/var/lib/docker/volumes下面的情况
[root@host88volumes]#pwd /var/lib/docker/volumes [root@host88volumes]#ll total0 drwxr-xr-x3rootroot18Jul2506:23volname [root@host88volumes]#find.-typef [root@host88volumes]#find.-typed . ./volname ./volname/_data [root@host88volumes]#
除了目录结构没有任何文件存在
Step2:在Container中保存数据Helloworld
root@b2e3523a6dd9:/volumedata/dbdata#ls-l total0 root@b2e3523a6dd9:/volumedata/dbdata#echo"hello,world">>helloworld root@b2e3523a6dd9:/volumedata/dbdata#cathelloworld hello,world root@b2e3523a6dd9:/volumedata/dbdata#ls-l total4 -rw-r--r--1rootroot13Jul2506:26helloworld root@b2e3523a6dd9:/volumedata/dbdata#
在外部确认该信息是否已经存在
[root@host88volumes]#pwd /var/lib/docker/volumes [root@host88volumes]#find.-typef ./volname/_data/helloworld [root@host88volumes]#cat./volname/_data/helloworld hello,world [root@host88volumes]#
Step3:在外部直接修改该文件
[root@host88volumes]#pwd /var/lib/docker/volumes [root@host88volumes]#find.-typef ./volname/_data/helloworld [root@host88volumes]#cat./volname/_data/helloworld hello,world [root@host88volumes]#echo"hell,thisis`hostname`">>./volname/_data/helloworld [root@host88volumes]#cat./volname/_data/helloworld hello,world hell,thisishost88 [root@host88volumes]#
在内部确认信息
root@b2e3523a6dd9:/volumedata/dbdata#ls-l total4 -rw-r--r--1rootroot34Jul2506:29helloworld root@b2e3523a6dd9:/volumedata/dbdata#cathelloworld hello,world hell,thisishost88 root@b2e3523a6dd9:/volumedata/dbdata#
从Container中退出前再追加一条信息
root@b2e3523a6dd9:/volumedata/dbdata#echo"hello,Iwillexitfrom`hostname`">>helloworld root@b2e3523a6dd9:/volumedata/dbdata#cathelloworld hello,world hell,thisishost88 hello,Iwillexitfromb2e3523a6dd9 root@b2e3523a6dd9:/volumedata/dbdata#
Step4:退出Container后看数据是否仍然存在
root@b2e3523a6dd9:/volumedata/dbdata#exit exit [root@host88volumes]#find.-typef ./volname/_data/helloworld [root@host88volumes]#cat./volname/_data/helloworld hello,world hell,thisishost88 hello,Iwillexitfromb2e3523a6dd9 [root@host88volumes]#
数据仍然存在。使用dockervolumels可以看到刚刚volname的数据卷也依然存在。
[root@host88volumes]#dockervolumels DRIVERVOLUMENAME localvolname [root@host88volumes]#
数据卷的管理
docker的volume的管理目前主要有下面4种:create/ls/inspect/rm
查询(ls)
[root@host88volumes]#dockervolumels DRIVERVOLUMENAME localvolname [root@host88volumes]#
正常的环境一定不会跑出这么清静的结果。
inspect
[root@host88volumes]#dockervolumeinspectvolname [ { "Name":"volname", "Driver":"local", "Mountpoint":"/var/lib/docker/volumes/volname/_data" } ] [root@host88volumes]#
其实这个信息可能会觉得非常眼熟,看完dockerinsepect的结果就会发现,内容是一致的,以下是dockerinspectb2e3523a6dd9的mounts相关信息
"Mounts":[ { "Name":"volname", "Source":"/var/lib/docker/volumes/volname/_data", "Destination":"/volumedata/dbdata", "Driver":"local", "Mode":"z", "RW":true, "Propagation":"rslave" } ],
删除(rm)
删除之前的确认
[root@host88volumes]#pwd /var/lib/docker/volumes [root@host88volumes]#find.-typef ./volname/_data/helloworld [root@host88volumes]#cat./volname/_data/helloworld hello,world hell,thisishost88 hello,Iwillexitfromb2e3523a6dd9 [root@host88volumes]#dockervolumels DRIVERVOLUMENAME localvolname [root@host88volumes]#
删除volume之前需要删除与其有依赖关系的container
[root@host88volumes]#dockerrmb2e3523a6dd9 b2e3523a6dd9 [root@host88volumes]#
删除container并不会将volume一并删除
[root@host88volumes]#pwd /var/lib/docker/volumes [root@host88volumes]#find.-typef ./volname/_data/helloworld [root@host88volumes]#
而使用dockervolumerm则会干净地删除掉所有信息
[root@host88volumes]#dockervolumermvolname volname [root@host88volumes]#ll total0 [root@host88volumes]#dockervolumels DRIVERVOLUMENAME [root@host88volumes]#
长时间运行的Docker环境中,成为僵尸的不只是/var/lib/docker/volumes下面的实际数据
而且dockervolumels中也会有很多完全不知道的信息,甚至有些相关联的实际数据已经被删除
这种情况在很多考虑不足的环境中屡见不鲜,虽然只是很简单的helloworld
数据管理时候需要考虑的问题还是值得引起足够的重视。
创建(create):
可以像例子那样通过run和-v创建volume,同时也可以使用dockervolumecreate来创建
[root@host88volumes]#dockervolumecreate--driver=local--name=volname volname [root@host88volumes]#dockervolumels DRIVERVOLUMENAME localvolname [root@host88volumes]#
有些volume在创建时还要结合使用–opt参数(或者-o)
如果不指定–name参数,docker会体贴地替你取一个,大概就像下面这样
[root@host88volumes]#dockervolumels DRIVERVOLUMENAME localvolname [root@host88volumes]#dockervolumecreate e54a0022fdff1e0e57b8635317e0b51b1e36c3c9b8c48a051e7778a45f08a83d [root@host88volumes]#dockervolumels DRIVERVOLUMENAME localvolname locale54a0022fdff1e0e57b8635317e0b51b1e36c3c9b8c48a051e7778a45f08a83d [root@host88volumes]#
看着太闹心了,一下全部删掉吧。
[root@host88volumes]#dockervolumerm$(dockervolumels-q) volname e54a0022fdff1e0e57b8635317e0b51b1e36c3c9b8c48a051e7778a45f08a83d [root@host88volumes]#
需要注意的是这个名字必须是唯一的,所以前面也说到过不使用dockervolumerm来删除的话会导致问题,
下次用同样名字想要创建一个volume却发现已经存在的时候就只能是创建失败了。
多Container共用一个数据卷
Step1:创建一个NamedVolume
用你喜欢的方式创建一个namedvolume
[root@host88volumes]#dockervolumecreate--name=volname volname [root@host88volumes]#dockervolumels DRIVERVOLUMENAME localvolname [root@host88volumes]#
Step2:路人甲Container与之相连
[root@host88volumes]#dockerrun-it-vvolname:/volumedata/dbdatadebian root@5a43b6347b53:/#
路人甲使用Debian,他想知道谁是docker的主机
root@5a43b6347b53:/#ls binbootdevetchomeliblib64mediamntoptprocrootrunsbinsrvsystmpusrvarvolumedata root@5a43b6347b53:/#cdvolumedata/dbdata root@5a43b6347b53:/volumedata/dbdata#ls-l total0 root@5a43b6347b53:/volumedata/dbdata#echo"hello,worldby`hostname`,whoishost?">>helloworld root@5a43b6347b53:/volumedata/dbdata#cathelloworld hello,worldby5a43b6347b53,whoishost? root@5a43b6347b53:/volumedata/dbdata#
Step3:主机与路人乙
主机此时看到了这个信息
[root@host88volumes]#pwd /var/lib/docker/volumes [root@host88volumes]#find.-typef ./volname/_data/helloworld [root@host88volumes]#cat./volname/_data/helloworld hello,worldby5a43b6347b53,whoishost? [root@host88volumes]#
同时路人乙也与该volume进行了连接
[root@host88~]#dockerrun-it-vvolname:/volumedata/dbdatacentos [root@6365668cea55/]#
BTW,Docker现在不能使用相对路径,所以volname:/volumedata/dbdata的这个写法最前面的/仍然是不可或缺.
路人乙说虽然你不是找我,但是我看见了,这是共享的,我就可以回信么,说我不知道。
[root@6365668cea55dbdata]#ls-l total4 -rw-r--r--1rootroot43Jul2509:36helloworld [root@6365668cea55dbdata]#cathelloworld hello,worldby5a43b6347b53,whoishost? [root@6365668cea55dbdata]#echo"hello,worldby`hostname`,Idonotknow">>helloworld [root@6365668cea55dbdata]#cathelloworld hello,worldby5a43b6347b53,whoishost? hello,worldby6365668cea55,Idonotknow [root@6365668cea55dbdata]#
Step4:主机与路人丙
主机什么时候都能看见信息的更新,作为应该回邮件的人,完全有权利装作看不见
[root@host88volumes]#pwd /var/lib/docker/volumes [root@host88volumes]#ll total0 drwxr-xr-x3rootroot18Jul2505:31volname [root@host88volumes]#find.-typef ./volname/_data/helloworld [root@host88volumes]#cat./volname/_data/helloworld hello,worldby5a43b6347b53,whoishost? hello,worldby6365668cea55,Idonotknow [root@host88volumes]#
路人丙使用ubuntu,他觉得这样数据设计地实在不好,他表示他根本不想看到这样的信息,大家不要再replytoall
[root@host88~]#dockerrun-it-vvolname:/volumedata/dbdataubuntu root@730209b03ea6:/#cdvolumedata/dbdata root@730209b03ea6:/volumedata/dbdata#ls-l total4 -rw-r--r--1rootroot87Jul2509:44helloworld root@730209b03ea6:/volumedata/dbdata#cathelloworld hello,worldby5a43b6347b53,whoishost? hello,worldby6365668cea55,Idonotknow root@730209b03ea6:/volumedata/dbdata#echo"hello,worldby`hostname`,pleasedonotreplytoall">>helloworld root@730209b03ea6:/volumedata/dbdata#cathelloworld hello,worldby5a43b6347b53,whoishost? hello,worldby6365668cea55,Idonotknow hello,worldby730209b03ea6,pleasedonotreplytoall root@730209b03ea6:/volumedata/dbdata#
Step5:大家都看到了信息,决定都不再说话
作为和现实世界相反的期待,大家觉得这实在太无聊了,于是没有人再不断跳出来Replyall说请把我从maillink中剔除
[root@6365668cea55dbdata]#cathelloworld hello,worldby5a43b6347b53,whoishost? hello,worldby6365668cea55,Idonotknow hello,worldby730209b03ea6,pleasedonotreplytoall [root@6365668cea55dbdata]#
root@5a43b6347b53:/volumedata/dbdata#cathelloworld hello,worldby5a43b6347b53,whoishost? hello,worldby6365668cea55,Idonotknow hello,worldby730209b03ea6,pleasedonotreplytoall root@5a43b6347b53:/volumedata/dbdata#
[root@host88volumes]#cat./volname/_data/helloworld hello,worldby5a43b6347b53,whoishost? hello,worldby6365668cea55,Idonotknow hello,worldby730209b03ea6,pleasedonotreplytoall [root@host88volumes]#
实际多Container使用同一个Volume完全可以做的更好,把读写的权限进行合理设定,能够满足很多实际的场景。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!