Docker数据管理:Named volume
Docker中可以使用Named volume和data container来进行数据的管理。
单一Container的使用Helloworld
Step 1:创建一个Named Volume
事前确认volume的信息,没有VOLUME存在
[root@host88 volumes]# docker volume ls DRIVER VOLUME NAME [root@host88 volumes]#
确认/var/lib/docker/volumes的状况
[root@host88 volumes]# pwd /var/lib/docker/volumes [root@host88 volumes]# ll total 0 [root@host88 volumes]#
创建一个名为volname的数据卷,通过-v参数可以进行创建,同时也可以通过docker volume create来创建。
[root@host88 volumes]# docker run -it -v volname:/volumedata/dbdata debian root@b2e3523a6dd9:/# cd volumedata/dbdata root@b2e3523a6dd9:/volumedata/dbdata# ls -l total 0 root@b2e3523a6dd9:/volumedata/dbdata#
在Container外部确认此事volname是否已经创建成功
[root@host88 volumes]# docker volume ls DRIVER VOLUME NAME local volname [root@host88 volumes]#
确认/var/lib/docker/volumes下面 的情况
[root@host88 volumes]# pwd /var/lib/docker/volumes [root@host88 volumes]# ll total 0 drwxr-xr-x 3 root root 18 Jul 25 06:23 volname [root@host88 volumes]# find . -type f [root@host88 volumes]# find . -type d . ./volname ./volname/_data [root@host88 volumes]#
除了目录结构没有任何文件存在
Step 2:在Container中保存数据Hello world
root@b2e3523a6dd9:/volumedata/dbdata# ls -l total 0 root@b2e3523a6dd9:/volumedata/dbdata# echo "hello, world" helloworld root@b2e3523a6dd9:/volumedata/dbdata# cat helloworld hello, world root@b2e3523a6dd9:/volumedata/dbdata# ls -l total 4 -rw-r--r-- 1 root root 13 Jul 25 06:26 helloworld root@b2e3523a6dd9:/volumedata/dbdata#
在外部确认该信息是否已经存在
[root@host88 volumes]# pwd /var/lib/docker/volumes [root@host88 volumes]# find . -type f ./volname/_data/helloworld [root@host88 volumes]# cat ./volname/_data/helloworld hello, world [root@host88 volumes]#
Step 3:在外部直接修改该文件
[root@host88 volumes]# pwd /var/lib/docker/volumes [root@host88 volumes]# find . -type f ./volname/_data/helloworld [root@host88 volumes]# cat ./volname/_data/helloworld hello, world [root@host88 volumes]# echo "hell, this is `hostname`" ./volname/_data/helloworld [root@host88 volumes]# cat ./volname/_data/helloworld hello, world hell, this is host88 [root@host88 volumes]#
在内部确认信息
root@b2e3523a6dd9:/volumedata/dbdata# ls -l total 4 -rw-r--r-- 1 root root 34 Jul 25 06:29 helloworld root@b2e3523a6dd9:/volumedata/dbdata# cat helloworld hello, world hell, this is host88 root@b2e3523a6dd9:/volumedata/dbdata#
从Container中退出前再追加一条信息
root@b2e3523a6dd9:/volumedata/dbdata# echo "hello, I will exit from `hostname`" helloworld root@b2e3523a6dd9:/volumedata/dbdata# cat helloworld hello, world hell, this is host88 hello, I will exit from b2e3523a6dd9 root@b2e3523a6dd9:/volumedata/dbdata#
Step 4:退出Container后看数据是否仍然存在
root@b2e3523a6dd9:/volumedata/dbdata# exit exit [root@host88 volumes]# find . -type f ./volname/_data/helloworld [root@host88 volumes]# cat ./volname/_data/helloworld hello, world hell, this is host88 hello, I will exit from b2e3523a6dd9 [root@host88 volumes]#
数据仍然存在。使用docker volume ls可以看到刚刚volname的数据卷也依然存在。
[root@host88 volumes]# docker volume ls DRIVER VOLUME NAME local volname [root@host88 volumes]#
数据卷的管理
docker的volume的管理目前主要有下面4种:create/ls/inspect/rm
查询(ls)
[root@host88 volumes]# docker volume ls DRIVER VOLUME NAME local volname [root@host88 volumes]#
正常的环境一定不会跑出这么清静的结果。
inspect
[root@host88 volumes]# docker volume inspect volname [ { "Name": "volname", "Driver": "local", "Mountpoint": "/var/lib/docker/volumes/volname/_data" } ] [root@host88 volumes]#
其实这个信息可能会觉得非常眼熟,看完docker insepect 的结果就会发现,内容是一致的,以下是docker inspect b2e3523a6dd9的mounts相关信息
"Mounts": [ { "Name": "volname", "Source": "/var/lib/docker/volumes/volname/_data", "Destination": "/volumedata/dbdata", "Driver": "local", "Mode": "z", "RW": true, "Propagation": "rslave" } ],
删除(rm)
删除之前的确认
[root@host88 volumes]# pwd /var/lib/docker/volumes [root@host88 volumes]# find . -type f ./volname/_data/helloworld [root@host88 volumes]# cat ./volname/_data/helloworld hello, world hell, this is host88 hello, I will exit from b2e3523a6dd9 [root@host88 volumes]# docker volume ls DRIVER VOLUME NAME local volname [root@host88 volumes]#
删除volume之前需要删除与其有依赖关系的container
[root@host88 volumes]# docker rm b2e3523a6dd9 b2e3523a6dd9 [root@host88 volumes]#
删除container并不会将volume一并删除
[root@host88 volumes]# pwd /var/lib/docker/volumes [root@host88 volumes]# find . -type f ./volname/_data/helloworld [root@host88 volumes]#
而使用docker volume rm则会干净地删除掉所有信息
[root@host88 volumes]# docker volume rm volname volname [root@host88 volumes]# ll total 0 [root@host88 volumes]# docker volume ls DRIVER VOLUME NAME [root@host88 volumes]#
长时间运行的Docker环境中,成为僵尸的不只是/var/lib/docker/volumes下面的实际数据
而且docker volume ls中也会有很多完全不知道的信息,甚至有些相关联的实际数据已经被删除
这种情况在很多考虑不足的环境中屡见不鲜,虽然只是很简单的helloworld
数据管理时候需要考虑的问题还是值得引起足够的重视。
创建(create):
可以像例子那样通过run 和-v创建volume,同时也可以使用docker volume create来创建
[root@host88 volumes]# docker volume create --driver=local --name=volname volname [root@host88 volumes]# docker volume ls DRIVER VOLUME NAME local volname [root@host88 volumes]#
有些volume在创建时还要结合使用–opt参数(或者-o)
如果不指定–name参数,docker会体贴地替你取一个,大概就像下面这样
[root@host88 volumes]# docker volume ls DRIVER VOLUME NAME local volname [root@host88 volumes]# docker volume create e54a0022fdff1e0e57b8635317e0b51b1e36c3c9b8c48a051e7778a45f08a83d [root@host88 volumes]# docker volume ls DRIVER VOLUME NAME local volname local e54a0022fdff1e0e57b8635317e0b51b1e36c3c9b8c48a051e7778a45f08a83d [root@host88 volumes]#
看着太闹心了,一下全部删掉吧。
[root@host88 volumes]# docker volume rm $(docker volume ls -q) volname e54a0022fdff1e0e57b8635317e0b51b1e36c3c9b8c48a051e7778a45f08a83d [root@host88 volumes]#
需要注意的是这个名字必须是唯一的,所以前面也说到过不使用docker volume rm来删除的话会导致问题,
下次用同样名字想要创建一个volume却发现已经存在的时候就只能是创建失败了。
多Container共用一个数据卷
Step 1:创建一个Named Volume
用你喜欢的方式创建一个named volume
[root@host88 volumes]# docker volume create --name=volname volname [root@host88 volumes]# docker volume ls DRIVER VOLUME NAME local volname [root@host88 volumes]#
Step 2:路人甲Container与之相连
[root@host88 volumes]# docker run -it -v volname:/volumedata/dbdata debian root@5a43b6347b53:/#
路人甲使用Debian,他想知道谁是docker的主机
root@5a43b6347b53:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var volumedata root@5a43b6347b53:/# cd volumedata/dbdata root@5a43b6347b53:/volumedata/dbdata# ls -l total 0 root@5a43b6347b53:/volumedata/dbdata# echo "hello, world by `hostname`, who is host" helloworld root@5a43b6347b53:/volumedata/dbdata# cat helloworld hello, world by 5a43b6347b53, who is host"htmlcode">[root@host88 volumes]# pwd /var/lib/docker/volumes [root@host88 volumes]# find . -type f ./volname/_data/helloworld [root@host88 volumes]# cat ./volname/_data/helloworld hello, world by 5a43b6347b53, who is host"htmlcode">[root@host88 ~]# docker run -it -v volname:/volumedata/dbdata centos [root@6365668cea55 /]#BTW,Docker现在不能使用相对路径,所以volname:/volumedata/dbdata的这个写法最前面的/仍然是不可或缺.
路人乙说虽然你不是找我,但是我看见了,这是共享的,我就可以回信么,说我不知道。
[root@6365668cea55 dbdata]# ls -l total 4 -rw-r--r-- 1 root root 43 Jul 25 09:36 helloworld [root@6365668cea55 dbdata]# cat helloworld hello, world by 5a43b6347b53, who is host"hello, world by `hostname`, I do not know" helloworld [root@6365668cea55 dbdata]# cat helloworld hello, world by 5a43b6347b53, who is host"htmlcode">[root@host88 volumes]# pwd /var/lib/docker/volumes [root@host88 volumes]# ll total 0 drwxr-xr-x 3 root root 18 Jul 25 05:31 volname [root@host88 volumes]# find . -type f ./volname/_data/helloworld [root@host88 volumes]# cat ./volname/_data/helloworld hello, world by 5a43b6347b53, who is host"htmlcode">[root@host88 ~]# docker run -it -v volname:/volumedata/dbdata ubuntu root@730209b03ea6:/# cd volumedata/dbdata root@730209b03ea6:/volumedata/dbdata# ls -l total 4 -rw-r--r-- 1 root root 87 Jul 25 09:44 helloworld root@730209b03ea6:/volumedata/dbdata# cat helloworld hello, world by 5a43b6347b53, who is host"hello, world by `hostname`, please do not reply to all" helloworld root@730209b03ea6:/volumedata/dbdata# cat helloworld hello, world by 5a43b6347b53, who is host"htmlcode">[root@6365668cea55 dbdata]# cat helloworld hello, world by 5a43b6347b53, who is host"htmlcode">root@5a43b6347b53:/volumedata/dbdata# cat helloworld hello, world by 5a43b6347b53, who is host"htmlcode">[root@host88 volumes]# cat ./volname/_data/helloworld hello, world by 5a43b6347b53, who is host? hello, world by 6365668cea55, I do not know hello, world by 730209b03ea6, please do not reply to all [root@host88 volumes]#实际多Container使用同一个Volume完全可以做的更好,把读写的权限进行合理设定,能够满足很多实际的场景。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com暂无“Docker 数据管理Named volume详解”评论...
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新动态
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]