Docker 数据管理Named volume详解
发布时间 - 2026-01-11 00:16:13 点击率:次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? 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/helloworld hello, 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 -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? [root@6365668cea55 dbdata]# echo "hello, world by `hostname`, I do not know" >> helloworld [root@6365668cea55 dbdata]# cat helloworld hello, 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]# 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? hello, world by 6365668cea55, I do not know [root@host88 volumes]#
路人丙使用ubuntu,他觉得这样数据设计地实在不好,他表示他根本不想看到这样的信息,大家不要再reply to all
[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 6365668cea55, I do not know root@730209b03ea6:/volumedata/dbdata# echo "hello, world by `hostname`, please do not reply to all" >> helloworld root@730209b03ea6:/volumedata/dbdata# cat 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@730209b03ea6:/volumedata/dbdata#
Step 5:大家都看到了信息,决定都不再说话
作为和现实世界相反的期待,大家觉得这实在太无聊了,于是没有人再不断跳出来Reply all说请把我从mail link中剔除
[root@6365668cea55 dbdata]# cat 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@6365668cea55 dbdata]#
root@5a43b6347b53:/volumedata/dbdata# cat 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@5a43b6347b53:/volumedata/dbdata#
[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完全可以做的更好,把读写的权限进行合理设定,能够满足很多实际的场景。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Docker数据管理Named
# volume
# Docker
# 数据管理
# Named
# volume详解
# Docker中容器数据卷(Data Volume)和数据管理详解
# 浅谈docker Dockerfile 指令 VOLUME 介绍
# Docker volume使用详解及实例
# docker中容器数据卷volume介绍
# 创建一个
# 可以使用
# 的人
# 的是
# 路人甲
# 这是
# 看到了
# 看着
# 我就
# 就会
# 会有
# 就像
# 大家都
# 什么时候
# 都能
# 没有任何
# 把我
# 长时间
# 说我
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
再谈Python中的字符串与字符编码(推荐)
如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全
Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载
laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法
制作企业网站建设方案,怎样建设一个公司网站?
如何选择可靠的免备案建站服务器?
北京网站制作公司哪家好一点,北京租房网站有哪些?
如何在云虚拟主机上快速搭建个人网站?
详解Huffman编码算法之Java实现
Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】
js实现获取鼠标当前的位置
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口
如何为不同团队 ID 动态生成多个非值班状态按钮
如何解决hover在ie6中的兼容性问题
php485函数参数是什么意思_php485各参数详细说明【介绍】
如何在自有机房高效搭建专业网站?
HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】
Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册
UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】
HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】
JavaScript模板引擎Template.js使用详解
Laravel如何实现API版本控制_Laravel版本化API设计方案
长沙做网站要多少钱,长沙国安网络怎么样?
php json中文编码为null的解决办法
Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析
edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
javascript中的try catch异常捕获机制用法分析
如何用IIS7快速搭建并优化网站站点?
开心动漫网站制作软件下载,十分开心动画为何停播?
如何快速搭建高效WAP手机网站?
高端云建站费用究竟需要多少预算?
微信小程序 scroll-view组件实现列表页实例代码
Laravel怎么判断请求类型_Laravel Request isMethod用法
如何在建站之星网店版论坛获取技术支持?
进行网站优化必须要坚持的四大原则
如何有效防御Web建站篡改攻击?
iOS UIView常见属性方法小结
如何在腾讯云免费申请建站?
如何快速查询网站的真实建站时间?
Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】
Laravel如何自定义分页视图?(Pagination示例)
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
Laravel storage目录权限问题_Laravel文件写入权限设置
Laravel如何优化应用性能?(缓存和优化命令)
Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)

