首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
SAAS
ToB门户
了解全球最新的ToB事件
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
微博
Follow
记录
Doing
博客
Blog
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
排行榜
Ranklist
相册
Album
应用中心
qidao123.com ToB IT社区-企服评测·应用市场
»
论坛
›
物联网/工业互联网
›
物联网
›
Docker 数据卷管理及优化
返回列表
发新帖
Docker 数据卷管理及优化
[复制链接]
发表于 2025-10-24 02:26:38
|
显示全部楼层
|
阅读模式
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
×
Docker 数据卷是一个可供
容器
利用的特别目次,它绕过了
容器
的文件体系,直接将数据
存储
在宿主机上。通过数据卷,可以实现数据的长期化、共享以及独立于
容器
生命周期的管理。
1.1 为什么要用数据卷
Docker 分层文件体系的特点
性能
差
:Docker 的分层文件体系(Union File System)在写入操纵时会创建新的层,导致
性能
降落。
生命周期与容器雷同
:容器删除后,其文件体系中的数据也会丢失。
Docker 数据卷的上风
绕开分层文件体系
:数据卷直接挂载到宿主机的文件体系中,
性能
与宿主机磁盘雷同。
数据长期化
:纵然容器被删除或重新创建,数据卷中的数据仍旧存在,不会丢失。
数据共享
:多个容器可以同时挂载同一个数据卷,实现数据的共享和交互。
独立于容器生命周期
:数据卷的生命周期独立于容器,不受容器的启动、克制和删除的影响。
Docker 提供了两种卷范例:
Bind Mount
:将主机上的目次或文件挂载到容器中。
Docker Managed Volume
:由 Docker 主动管理的数据卷,不须要指定挂载源。
1.2 Bind Mount 数据卷
特点
将主机上的目次或文件挂载到容器中。
利用直观高效,易于明确。
利用 -v 选项指定路径,格式为 <host path>:<container path>。
如果 -v 选项指定的路径不存在,挂载时会主动创建。
注意事项
1. “如果挂载的路径在宿主机上不存在,Docker 会主动创建该路径。”
这句话的意思是:当你利用绑定挂载(bind mount)时,如果宿主机上的
目次
路径不存在,Docker 会主动创建这个目次。
举例分析:
假设你运行以下下令:
docker run -d --name my_container -v /haha/test:/container/path nginx:1.23
复制
代码
如果宿主机上 /haha/test
目次
不存在,Docker 会主动创建 /haha/test 目次。
这个举动是为了确保挂载操纵可以或许乐成实行,由于挂载须要一个有效的宿主机路径。
2. “如果须要挂载的文件或目次在宿主机上不存在,大概会导致容器启动失败。”
这句话的意思是:如果你实行挂载一个
文件
,而这个文件在宿主机上不存在,Docker 会报错并导致容器启动失败。
举例分析:
假设你运行以下下令:
docker run -d --name my_container -v /haha/test/file.txt:/container/file.txt nginx:1.23
复制
代码
如果宿主机上 /haha/test/file.txt
文件
不存在,Docker 会报错,由于 Docker 不会主动创建文件。它只会主动创建目次,而不会创建文件。
错误信息大概雷同于:
lstat /haha/test/file.txt: no such file or directory
这种情况下,容器无法启动,由于挂载操纵失败了。
总结:(主动创建的是目次,而不是文件)
目次
:如果挂载的路径(目次)在宿主机上不存在,Docker 会主动创建该目次。
文件
:如果挂载的文件在宿主机上不存在,Docker 不会主动创建文件,而是会报错并大概导致容器启动失败。
1.3 Docker Managed 数据卷
特点
不须要指定挂载源,Docker 主动为容器创建数据卷目次。
默认创建的数据卷目次位于 /var/lib/docker/volumes 中。
如果挂载时指向容器内已有的目次,原有数据会被复制到数据卷中。
示例
1. 不须要指定挂载源,Docker 主动为容器创建数据卷目次
定名卷由 Docker 主动管理,不须要指定宿主机上的路径。当你在运行容器时利用定名卷时,Docker 会主动创建一个卷,并将其挂载到容器内的指定路径。
举例分析:
docker run -d --name my_container -v my_volume:/container/path nginx:1.23
复制
代码
在这个例子中,my_volume 是一个定名卷的名称。
Docker 会主动在内部
存储
中创建一个名为 my_volume 的卷,并将其挂载到容器内的 /container/path。
你不须要指定宿主机上的路径,Docker 会管理这个卷的
存储
位置。
2. 默认创建的数据卷目次位于 /var/lib/docker/volumes 中
Docker 管理的定名卷默认存储在宿主机的 /var/lib/docker/volumes 目次下。每个定名卷都有一个独立的目次,用于存储数据。
举例分析:
假设你创建了一个名为 my_volume 的定名卷,Docker 会在 /var/lib/docker/volumes 下创建一个对应的目次:
/var/lib/docker/volumes/my_volume/_data
_data 目次是现实存储卷数据的地方。
你可以通过以下下令查察全部定名卷:
docker volume ls
复制代码
如果须要查察卷的具体存储位置,可以运行:
docker volume inspect my_volume
复制代码
3. 如果挂载时指向容器内已有的目次,原有数据会被复制到数据卷中
当你将一个定名卷挂载到容器内的某个路径时,如果该路径在容器中已经存在而且包罗数据,Docker 会将这些数据复制到定名卷中。这个过程称为“数据初始化”。
举例分析:
假设你运行以下下令:
docker run -d --name my_container -v my_volume:/container/existing/path nginx:1.23
复制代码
如果 /container/existing/path 在容器中已经存在,而且包罗一些文件或目次,Docker 会在第一次挂载时将这些内容复制到 my_volume 中。
之后,无论何时重新挂载该卷,容器内的 /container/existing/path 都会指向 my_volume,而且数据会保持同等。
注意:
这个数据复制的过程只会在第一次挂载时发生。
如果定名卷已经存在而且包罗数据,Docker 不会覆盖卷中的数据,而是会直接利用卷中的数据。
清算未利用的 Docker 数据卷
[root@docker ~]# docker volume prune
复制代码
注意
:
在实行 docker volume prune 下令之前,请确保你确实不再须要这些数据卷中的数据,由于该操纵是不可逆的,一旦删除数据将无法规复。
如果有紧张的数据存储在数据卷中,发起先辈行
备份
,大概确保数据已经被妥善生存到其他地方。
创建数据卷
[root@docker ~]# docker volume create leevol1
[root@docker ~]# ls -l /var/lib/docker/volumes/leevol1/_data/
复制代码
查察卷
[root@docker ~]#
docker volume lsDRIVER VOLUME NAMElocal leevol1
复制代码
利用创建的数据卷
[root@docker _data]# docker run -d --name web1 -p 80:80 -v leevol1:/usr/share/nginx/html nginx
e76706848323d6c329c41c4140903f8cc441458daf1459d9016bd1ed0ab3360a
root@docker _data]# cd /var/lib/docker/volumes/leevol1/_data
[root@docker _data]# ls
[root@docker _data]# echo leevol1 > index.html
[root@docker _data]# curl 172.25.254.100
leevol1
复制代码
1.4 数据卷容器(Data Volume Container)
数据卷容器(Data Volume Container)是 Docker 中一种特别的容器,紧张用于方便地在多个容器之间共享数据卷。
创建数据卷容器
[root@docker ~]# docker run -d --name datavol \
-v /tmp/data1:/data1:rw \
-v /tmp/data2:/data2:ro \
-v /etc/resolv.conf:/etc/hosts busybox
复制代码
利用数据卷容器
[root@docker ~]# docker run -it --name test --rm --volumes-from datavol busybox
/ # ls
bin data1 data2 dev etc home lib lib64 proc root sys tmp usr var
/ # cat /etc/resolv.conf
# Generated by Docker Engine.
# This file can be edited; Docker Engine will not make further changes once it
# has been modified.
nameserver 114.114.114.114
search timinglee.org
# Based on host file: '/etc/resolv.conf' (legacy)
# Overrides: []
/ # touch data1/leefile1
/ # touch /data2/leefile1
touch: /data2/leefile1: Read-only file system
/ #
复制代码
数据卷容器的上风
方便共享
:通过数据卷容器,可以在多个容器之间轻松共享数据卷。
简化管理
:数据卷容器可以会合管理数据卷,便于维护和迁徙。
1.5 Bind Mount 数据卷和 Docker Managed 数据卷的对比
雷同点
两者都是基于宿主机文件体系中的某个路径。
差别点
特性Bind Mount 数据卷Docker Managed 数据卷
路径指定
必须指定宿主机路径不须要指定宿主机路径,由 Docker 主动管理
移植性
依赖宿主机路径,移植性较差独立于宿主机路径,移植性较好
管理方式
须要手动管理宿主机路径由 Docker 主动管理,支持 docker volume 下令
性能
与宿主机磁盘性能雷同与宿主机磁盘性能雷同
实用场景
适当须要直接访问宿主机文件的场景适当须要在多个容器之间共享数据的场景
1.6
备份
与迁徙数据卷
备份
数据卷
# 建立容器并指定使用卷到要备份的容器
[root@docker ~]# docker run --volumes-from datavol \
-v `pwd`:/backup busybox \ # 把当前目录挂载到容器中用于保存备份数据
tar zcf /backup/data1.tar.gz /data1 # 备份数据到本地
复制代码
数据规复
docker run -it --name test -v leevol1:/data1 -v `pwd`:/backup busybox /bin/sh -c "tar zxf /backup/data1.tar.gz;/bin/sh"
/ # ls
backup data1 etc lib proc sys usr
bin dev home lib64 root tmp var
/ # cd data1/ # 查看
数据迁移
情况
/data1 # ls
index.html leefile1
复制代码
注意事项
在备份和规复数据卷时,确保路径准确,克制数据丢失。
如果数据卷较大,备份和规复过程大概须要较长时间,请耐烦期待。
回复
使用道具
举报
返回列表
浏览过的版块
SQL-Server
网络安全
Oracle
.Net
DevOps与敏捷开发
数据仓库与分析
Java
金歌
+ 我要发帖
登录后关闭弹窗
登录参与点评抽奖 加入IT实名职场社区
去登录
微信订阅号
微信服务号
微信客服(加群)
H5
小程序
快速回复
返回顶部
返回列表