当前位置: 首页 > news >正文

docker-卷

docker-卷

  • 前言
  • 一、卷的作用
  • 二、数据卷的基本操作
    • 2.1 创建数据卷
    • 2.2 查看数据卷
    • 2.3 在数据卷中创建网页内容
    • 2.4 启动 nginx 容器并挂载数据卷
  • 三、使用数据卷子路径实现多容器数据隔离
    • 3.1 准备数据卷目录结构
    • 3.2 启动两个nginx容器
    • 3.3 验证隔离效果
  • 四、结合 NFS 实现跨节点的数据共享
    • 4.1 搭建好nfs服务器
    • 4.2 新建共享目录和index.html网页
    • 4.3 配置nfs共享规则
    • 4.4 刷新共享配置
    • 4.5 在docker集群里的任意一个节点服务器上测试能否挂载nfs服务器共享的目录
    • 4.6 创建基于 NFS 的 Docker 数据卷
    • 4.7 使用 NFS 数据卷启动容器
  • 五、如何删除数据卷
  • 总结


前言

容器的数据保存问题-数据持久化-数据共享-volume

官方文档:https://docs.docker.com/engine/storage/volumes/

  1. 正常停止容器,容器里的数据会丢失吗?
    不会丢失,会保存 -> /var/lib/docker/volumes/

  2. 如何将容器里的数据保存到宿主机?
    volumn

  3. 如何在容器和宿主机之间传输数据?
    docker cp

  4. 修改了容器里某个应用程序对应的配置文件如何让配置文件生效?
    重启容器


一、卷的作用

  • 数据持久化:容器删除后,数据卷中的数据不会丢失
  • 容器间数据共享:多个容器可以挂载同一个数据卷
  • 主机与容器数据交互:方便在主机上操作容器数据
  • 提升性能:相比容器的可写层,数据卷的读写性能更好

卷就是存放数据的地方
Volumes are persistent data stores for containers, created and managed by Docker.
数据的持久化 --》保存到磁盘

如果是多台机器,背后需要使用nfs、NAS、SAN、云存储、ceph等网络存储解决

在这里插入图片描述


二、数据卷的基本操作

数据卷(Data Volume)是 Docker 中用于持久化存储容器数据的重要机制,它能够独立于容器的生命周期存在,解决了容器删除后数据丢失的问题

2.1 创建数据卷

[root@docker ~]# docker volume create sc-vol
sc-vol

2.2 查看数据卷

[root@docker ~]# docker volume ls
DRIVER VOLUME NAME
local a17a87a838ad2ca878c463b1fcd23c869232926dfc26861d2ebfaa0609f1de7b
local sc-vol

查看详细信息

[root@docker ~]# docker volume inspect sc-vol
[{"CreatedAt": "2025-09-12T10:24:39+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/sc-vol/_data","Name": "sc-vol","Options": null,"Scope": "local"}

2.3 在数据卷中创建网页内容

详细信息中有有存储路径

[root@docker ~]# cd /var/lib/docker/volumes/sc-vol/_data
[root@docker _data]# vim index.html
welcome to changsha!

2.4 启动 nginx 容器并挂载数据卷

将数据卷sc-vol挂载到容器的/usr/share/nginx/html目录

[root@docker _data]# docker run -d --name lwx-1 --mount source=sc-vol,target=/usr/share/nginx/html -p 8080:80 nginx
33d009828aeb2dbd9d9509fec17a2903f5e96157ab6b4dd052c990673b1b4211

此时访问主机的 8080 端口,会显示 “welcome to changsha!”

这种方式的优势:

  • 无需进入容器即可更新网页内容,直接修改主机上/var/lib/docker/volumes/sc-vol/_data目录下的文件即可
  • 容器删除后重新创建,网页内容不会丢失(因为数据保存在数据卷中)

三、使用数据卷子路径实现多容器数据隔离

3.1 准备数据卷目录结构

建两个子目录,分别供两个容器使用

[root@docker nginx_web]# cd /var/lib/docker/volumes/logs/_data
[root@docker _data]# mkdir app1 app2

3.2 启动两个nginx容器

[root@docker _data]# docker run -d --name zzl-nginx-1 -p 8093:80 -v logs --mount src=logs,dst=/var/log/app1,volume-subpath=app1 nginx
5b8aee139bcbfd9b96d9c4172cb64f0b5b27ed14343f383346fa039ce75491b3
[root@docker _data]# docker run -d --name zzl-nginx-2 -p 8094:80 -v logs --mount src=logs,dst=/var/log/app2,volume-subpath=app2 nginx
dfffa7f9b6db9129b997b2c06399011dc966d7a57ab64174f5d82275b6178489

3.3 验证隔离效果

进入zzl-nginx-2容器,在/var/log/app2目录创建文件

[root@docker _data]# docker exec -it zzl-nginx-1 bash
root@5b8aee139bcb:/# cd /var/log
root@5b8aee139bcb:/var/log# ls
app1  apt  btmp  dpkg.log  faillog  lastlog  nginx  wtmp
root@5b8aee139bcb:/var/log# exit
exit[root@docker _data]# docker exec -it zzl-nginx-2 bash
root@dfffa7f9b6db:/# cd /var/log
root@dfffa7f9b6db:/var/log# ls
app2  apt  btmp  dpkg.log  faillog  lastlog  nginx  wtmp
root@dfffa7f9b6db:/var/log# cd app2
root@dfffa7f9b6db:/var/log/app2# touch feng[root@docker app2]# ls
feng

这种子路径方式的优势:

  • 多个容器可以共享同一个数据卷,但各自使用独立的子目录,避免数据混乱
  • 便于集中管理所有相关数据,同时保持容器间的数据隔离
    节省资源,不需要为每个容器创建单独的数据卷

四、结合 NFS 实现跨节点的数据共享

4.1 搭建好nfs服务器

yum install nfs-utils -y # CentOS/RHEL系统
apt install nfs-client nfs-server -y # Ubuntu/Debian系统

docker集群内的所有的节点都安装nfs-utils软件,因为节点服务器里创建卷需要支持nfs网络文件系统

关闭防火墙服务并且设置开机不启动
设置nfs开机启动

[root@docker _data]# systemctl enable nfs-server
Created symlink /etc/systemd/system/multi-user.target.wants/nfs-server.service → /usr/lib/systemd/system/nfs-server.service.
[root@docker _data]# systemctl start nfs-server
[root@docker _data]# systemctl stop firewalld
[root@docker _data]# systemctl disable firewalld
Removed “/etc/systemd/system/multi-user.target.wants/firewalld.service”.
Removed “/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service”.

Ubuntu防火墙默认没开

root@huang:~# systemctl enable nfs-server

4.2 新建共享目录和index.html网页

[root@dns-nfs-prom-ansible ~]# mkdir /sc/web -p
[root@dns-nfs-prom-ansible ~]# cd /sc/web/
[root@dns-nfs-prom-ansible web]# echo “welcome to sanchuang” >index.html

4.3 配置nfs共享规则

[root@dns-nfs-prom-ansible web]# vim /etc/exports
/sc/web 192.168.168.0/24(rw,all_squash,sync)

  • /sc/web:需要共享的目录路径
  • 192.168.168.0/24:允许访问的客户端网段
  • rw:读写权限
  • all_squash:将所有访问的用户映射为匿名用户(通常是 nfsnobody)
  • sync:同步写入,数据实时写入磁盘(保证数据一致性)

4.4 刷新共享配置

-r 重新输出所有的共享目录
-v 显示输出的共享目录

[root@dns-nfs-prom-ansible web]# exportfs -rv
exporting 192.168.168.0/24:/sc/web
[root@dns-nfs-prom-ansible web]# systemctl restart nfs-server

4.5 在docker集群里的任意一个节点服务器上测试能否挂载nfs服务器共享的目录

root@huang:~# mount 192.168.168.139:/sc/web /mnt
root@huang:~# df -Th
Filesystem                        Type   Size  Used Avail Use% Mounted on
tmpfs                             tmpfs  387M  1.0M  386M   1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv ext4   9.8G  8.5G  786M  92% /
tmpfs                             tmpfs  1.9G     0  1.9G   0% /dev/shm
tmpfs                             tmpfs  5.0M     0  5.0M   0% /run/lock
/dev/sda2                         ext4   1.8G  192M  1.5G  12% /boot
tmpfs                             tmpfs  387M   12K  387M   1% /run/user/1000
192.168.168.139:/sc/web           nfs4    17G  4.0G   13G  24% /mnt

4.6 创建基于 NFS 的 Docker 数据卷

root@huang:~# docker volume create --driver local --opt type=nfs --opt o=addr=192.168.168.139,nolock,soft,ro,sync --opt device=:/sc/web nfs-web-1
nfs-web-1

  • nolock:禁用文件锁定(集群环境常用)
  • soft:软挂载,访问失败时快速返回错误

4.7 使用 NFS 数据卷启动容器

root@huang:~# docker run -d --name xiao-nginx-1 -p 8805:80 -v nfs-web-1:/usr/share/nginx/html nginx
98b4e2d8c3a7d7dd1a4e7e7561f25f421cdfcb7f5cebed09bc28968dfb402e28

另一台上做同样的操作

[root@docker web]# mount 192.168.168.139:/sc/web /mnt
[root@docker web]# docker volume create --driver local --opt type=nfs --opt o=addr=192.168.168.139,nolock,soft,ro,sync --opt device=:/sc/web nfs-web-1
nfs-web-1
[root@docker web]# docker run -d --name xiao-nginx-1 -p 8805:80 -v nfs-web-1:/usr/share/nginx/html nginx
8dcae1dea90e40a6a0e6c1ce86bd7e2089eeeb1563fb983820ff356b885d6277

访问,查看内容是否一样
在这里插入图片描述
在这里插入图片描述


五、如何删除数据卷

核心问题是 “数据卷被容器占用(即使容器已停止)”,需先清理关联容器才能删除卷

查看数据卷

[root@docker web]# docker volume ls
DRIVER VOLUME NAME
local logs
local nfs-web-1
local sc-vol

尝试删除logs卷失败

[root@docker web]# docker volume rm logs
Error response from daemon: remove logs: volume is in use - [e219505238326f4d9459e3ea02291e2d05846a542bc18575fab6ed8fdd3fc81e, 5b8aee139bcbfd9b96d9c4172cb64f0b5b27ed14343f383346fa039ce75491b3, dfffa7f9b6db9129b997b2c06399011dc966d7a57ab64174f5d82275b6178489]

停止所有正在运行的容器

[root@docker web]# docker stop $(docker ps|awk ‘NR>1{print $NF}’)
xiao-nginx-1
zzl-nginx-3
zzl-nginx-2
zzl-nginx-1
lwx-1
sc-mysql-1

再次尝试删除logs卷(仍失败)

[root@docker web]# docker volume rm logs
Error response from daemon: remove logs: volume is in use - [5b8aee139bcbfd9b96d9c4172cb64f0b5b27ed14343f383346fa039ce75491b3, dfffa7f9b6db9129b997b2c06399011dc966d7a57ab64174f5d82275b6178489, e219505238326f4d9459e3ea02291e2d05846a542bc18575fab6ed8fdd3fc81e]

删除所有停止的容器 -> 删除容器不会删除卷

[root@docker web]# docker rm $(docker ps -a|awk ‘NR>1{print $NF}’)
xiao-nginx-1
zzl-nginx-3
zzl-nginx-2
zzl-nginx-1
lwx-1
sc2
sc1
sc-mysql-1
sc-nginx-1

成功删除logs卷

[root@docker web]# docker volume rm logs
logs

当所有挂载过logs卷的容器被彻底删除后,卷的 “占用状态” 解除,此时才能正常删除数据卷

卷的生命周期独立于容器,但卷的删除依赖于 “关联容器的彻底清理”


总结

Docker 卷(Volume)是 Docker 中用于持久化存储容器数据的核心机制,它独立于容器的生命周期,能够解决容器删除后数据丢失的问题,同时支持容器间数据共享和主机与容器间的数据交互。理解并正确使用 Volume 是 Docker 数据管理的关键

http://www.dtcms.com/a/406155.html

相关文章:

  • 电子行业如何通过MES管理系统实现柔性制造,应对订单波动?
  • ​​[硬件电路-324]:芯片根据功能、信号类型、应用场景、制造工艺、集成度及设计理念等多个维度进行分类
  • 扶沟县建设局网站网络规划与设计教程
  • 文化传播公司网站模版网站建设哪好
  • Charles 抓包 HTTPS 原理详解,从 CONNECT 到 SSL Proxying、常见问题与真机调试实战(含 Sniffmaster 补充方案)
  • LeetCode 135.分发糖果
  • 计算机视觉:OpenCV+Dlib 人脸检测
  • 开源 C# 快速开发(二)基础控件
  • 安庆公司做网站国外开源商城系统
  • 烟台哪家公司可以做网站灌云县建设局网站
  • 基于sprintboot+vue的智慧辅助学习系统(源码+论文+部署+安装)
  • 基于阿里云系列平台的python微服务设计与DevOps实践
  • 山东临沂网站开发免费的推广网站
  • PAT乙级_1047 编程团体赛_Python_AC解法_无疑难点
  • SystemVerilog小白入门1, iverilog+VScode
  • 微算法科技(NASDAQ: MLGO)融合二次矩阵变换模型,研发基于区块链的可溯源IP版权保护算法
  • 示范校建设验收网站做ppt图片用的网站
  • 新宁县建设局网站沭阳网站建设多少钱
  • 脑电模型实战系列:深化网络-多层全连接在情绪识别中的威力
  • Java HTTP协议(二)--- HTTPS,Tomcat
  • 深度学习学习路线图:从MNIST到MobileNetV4,从理论到实践的完整指南——轻量化模型演进与前沿实践
  • Linux925 shell 变量:本地、环境变量、全局变量;数组:普通数组、关联数组;交互定义、basename、dirname
  • 低价网站备案海报设计制作平台
  • 解读2025 《可信数据空间 技术能力评价规范》
  • 【51单片机篮球记分器+复合按键操作】2022-12-22
  • 网站域名属于哪里管网站 类库
  • 【超分辨率专题】DLoRAL:视频超分辨率的新范式,细节与时序一致的双重提升
  • VS2022 C++调试完全指南
  • 【JAVA】从入门到放弃-01-HelloWorld
  • 玳瑁的嵌入式日记---0925(ARM--时钟)