侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Docker 数据管理Named volume详解

Docker  /  管理员 发布于 7年前   158

Docker数据管理:Named volume

Docker中可以使用Named volume和data container来进行数据的管理。

单一Container的使用Helloworld

Step 1:创建一个Named Volume

事前确认volume的信息,没有VOLUME存在

[root@host88 volumes]# docker volume lsDRIVER    VOLUME NAME[root@host88 volumes]#

确认/var/lib/docker/volumes的状况

[root@host88 volumes]# pwd/var/lib/docker/volumes[root@host88 volumes]# lltotal 0[root@host88 volumes]#

创建一个名为volname的数据卷,通过-v参数可以进行创建,同时也可以通过docker volume create来创建。

[root@host88 volumes]# docker run -it -v volname:/volumedata/dbdata debianroot@b2e3523a6dd9:/# cd volumedata/dbdataroot@b2e3523a6dd9:/volumedata/dbdata# ls -ltotal 0root@b2e3523a6dd9:/volumedata/dbdata#

在Container外部确认此事volname是否已经创建成功

[root@host88 volumes]# docker volume lsDRIVER    VOLUME NAMElocal    volname[root@host88 volumes]#

确认/var/lib/docker/volumes下面 的情况

[root@host88 volumes]# pwd/var/lib/docker/volumes[root@host88 volumes]# lltotal 0drwxr-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 -ltotal 0root@b2e3523a6dd9:/volumedata/dbdata# echo "hello, world" >>helloworldroot@b2e3523a6dd9:/volumedata/dbdata# cat helloworldhello, worldroot@b2e3523a6dd9:/volumedata/dbdata# ls -ltotal 4-rw-r--r-- 1 root root 13 Jul 25 06:26 helloworldroot@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/helloworldhello, 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/helloworldhello, world[root@host88 volumes]# echo "hell, this is `hostname`" >>./volname/_data/helloworld[root@host88 volumes]# cat ./volname/_data/helloworldhello, worldhell, this is host88[root@host88 volumes]#

在内部确认信息

root@b2e3523a6dd9:/volumedata/dbdata# ls -ltotal 4-rw-r--r-- 1 root root 34 Jul 25 06:29 helloworldroot@b2e3523a6dd9:/volumedata/dbdata# cat helloworldhello, worldhell, this is host88root@b2e3523a6dd9:/volumedata/dbdata#

从Container中退出前再追加一条信息

root@b2e3523a6dd9:/volumedata/dbdata# echo "hello, I will exit from `hostname`" >>helloworldroot@b2e3523a6dd9:/volumedata/dbdata# cat helloworldhello, worldhell, this is host88hello, I will exit from b2e3523a6dd9root@b2e3523a6dd9:/volumedata/dbdata#

Step 4:退出Container后看数据是否仍然存在

root@b2e3523a6dd9:/volumedata/dbdata# exitexit[root@host88 volumes]# find . -type f./volname/_data/helloworld[root@host88 volumes]# cat ./volname/_data/helloworldhello, worldhell, this is host88hello, I will exit from b2e3523a6dd9[root@host88 volumes]#

数据仍然存在。使用docker volume ls可以看到刚刚volname的数据卷也依然存在。

[root@host88 volumes]# docker volume lsDRIVER    VOLUME NAMElocal    volname[root@host88 volumes]#

数据卷的管理

docker的volume的管理目前主要有下面4种:create/ls/inspect/rm

查询(ls)

[root@host88 volumes]# docker volume lsDRIVER    VOLUME NAMElocal    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/helloworldhello, worldhell, this is host88hello, I will exit from b2e3523a6dd9[root@host88 volumes]# docker volume lsDRIVER    VOLUME NAMElocal    volname[root@host88 volumes]#

删除volume之前需要删除与其有依赖关系的container

[root@host88 volumes]# docker rm b2e3523a6dd9b2e3523a6dd9[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 volnamevolname[root@host88 volumes]# lltotal 0[root@host88 volumes]# docker volume lsDRIVER    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=volnamevolname[root@host88 volumes]# docker volume lsDRIVER    VOLUME NAMElocal    volname[root@host88 volumes]#

有些volume在创建时还要结合使用Copt参数(或者-o)

如果不指定Cname参数,docker会体贴地替你取一个,大概就像下面这样

[root@host88 volumes]# docker volume lsDRIVER    VOLUME NAMElocal    volname[root@host88 volumes]# docker volume createe54a0022fdff1e0e57b8635317e0b51b1e36c3c9b8c48a051e7778a45f08a83d[root@host88 volumes]# docker volume lsDRIVER    VOLUME NAMElocal    volnamelocal    e54a0022fdff1e0e57b8635317e0b51b1e36c3c9b8c48a051e7778a45f08a83d[root@host88 volumes]#

看着太闹心了,一下全部删掉吧。

[root@host88 volumes]# docker volume rm $(docker volume ls -q)volnamee54a0022fdff1e0e57b8635317e0b51b1e36c3c9b8c48a051e7778a45f08a83d[root@host88 volumes]#

需要注意的是这个名字必须是唯一的,所以前面也说到过不使用docker volume rm来删除的话会导致问题,

下次用同样名字想要创建一个volume却发现已经存在的时候就只能是创建失败了。

多Container共用一个数据卷

Step 1:创建一个Named Volume

用你喜欢的方式创建一个named volume

[root@host88 volumes]# docker volume create --name=volnamevolname[root@host88 volumes]# docker volume lsDRIVER    VOLUME NAMElocal    volname[root@host88 volumes]#

Step 2:路人甲Container与之相连

[root@host88 volumes]# docker run -it -v volname:/volumedata/dbdata debianroot@5a43b6347b53:/#

路人甲使用Debian,他想知道谁是docker的主机

root@5a43b6347b53:/# lsbin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var volumedataroot@5a43b6347b53:/# cd volumedata/dbdataroot@5a43b6347b53:/volumedata/dbdata# ls -ltotal 0root@5a43b6347b53:/volumedata/dbdata# echo "hello, world by `hostname`, who is host?" >> helloworldroot@5a43b6347b53:/volumedata/dbdata# cat helloworldhello, world by 5a43b6347b53, who is host?root@5a43b6347b53:/volumedata/dbdata#

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/helloworldhello, world by 5a43b6347b53, who is host?[root@host88 volumes]#

同时路人乙也与该volume进行了连接

[root@host88 ~]# docker run -it -v volname:/volumedata/dbdata centos[root@6365668cea55 /]#

BTW,Docker现在不能使用相对路径,所以volname:/volumedata/dbdata的这个写法最前面的/仍然是不可或缺.
路人乙说虽然你不是找我,但是我看见了,这是共享的,我就可以回信么,说我不知道。

[root@6365668cea55 dbdata]# ls -ltotal 4-rw-r--r-- 1 root root 43 Jul 25 09:36 helloworld[root@6365668cea55 dbdata]# cat helloworldhello, world by 5a43b6347b53, who is host?[root@6365668cea55 dbdata]# echo "hello, world by `hostname`, I do not know" >> helloworld[root@6365668cea55 dbdata]# cat helloworldhello, world by 5a43b6347b53, who is host?hello, world by 6365668cea55, I do not know[root@6365668cea55 dbdata]#

Step 4:主机与路人丙

主机什么时候都能看见信息的更新,作为应该回邮件的人,完全有权利装作看不见

[root@host88 volumes]# pwd/var/lib/docker/volumes[root@host88 volumes]# lltotal 0drwxr-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/helloworldhello, world by 5a43b6347b53, who is host?hello, world by 6365668cea55, I do not know[root@host88 volumes]#

路人丙使用ubuntu,他觉得这样数据设计地实在不好,他表示他根本不想看到这样的信息,大家不要再reply to all

[root@host88 ~]# docker run -it -v volname:/volumedata/dbdata ubunturoot@730209b03ea6:/# cd volumedata/dbdataroot@730209b03ea6:/volumedata/dbdata# ls -ltotal 4-rw-r--r-- 1 root root 87 Jul 25 09:44 helloworldroot@730209b03ea6:/volumedata/dbdata# cat helloworldhello, world by 5a43b6347b53, who is host?hello, world by 6365668cea55, I do not knowroot@730209b03ea6:/volumedata/dbdata# echo "hello, world by `hostname`, please do not reply to all" >> helloworldroot@730209b03ea6:/volumedata/dbdata# cat helloworldhello, world by 5a43b6347b53, who is host?hello, world by 6365668cea55, I do not knowhello, world by 730209b03ea6, please do not reply to allroot@730209b03ea6:/volumedata/dbdata#

Step 5:大家都看到了信息,决定都不再说话

作为和现实世界相反的期待,大家觉得这实在太无聊了,于是没有人再不断跳出来Reply all说请把我从mail link中剔除

[root@6365668cea55 dbdata]# cat helloworldhello, world by 5a43b6347b53, who is host?hello, world by 6365668cea55, I do not knowhello, world by 730209b03ea6, please do not reply to all[root@6365668cea55 dbdata]#
root@5a43b6347b53:/volumedata/dbdata# cat helloworldhello, world by 5a43b6347b53, who is host?hello, world by 6365668cea55, I do not knowhello, world by 730209b03ea6, please do not reply to allroot@5a43b6347b53:/volumedata/dbdata#
[root@host88 volumes]# cat ./volname/_data/helloworldhello, world by 5a43b6347b53, who is host?hello, world by 6365668cea55, I do not knowhello, world by 730209b03ea6, please do not reply to all[root@host88 volumes]#

实际多Container使用同一个Volume完全可以做的更好,把读写的权限进行合理设定,能够满足很多实际的场景。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


  • 上一条:
    什么是Docker? Docker入门教程
    下一条:
    Docker-compose的安装和设定详细步骤
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在docker环境中实现Laravel项目执行定时任务和消息队列流程步骤(0个评论)
    • 在MacBook下laravel项目多php版本docker开发环境配置方案(0个评论)
    • 在docker环境中部署docker部署elk架构流程步骤(1个评论)
    • docker compose跟Dockerfile的区别浅析(0个评论)
    • Ubuntu 22.04系统中安装podman流程步骤(1个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2017-11
    • 2020-06
    • 2021-05
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-11
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2024-03
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客