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/
-
正常停止容器,容器里的数据会丢失吗?
不会丢失,会保存 -> /var/lib/docker/volumes/ -
如何将容器里的数据保存到宿主机?
volumn -
如何在容器和宿主机之间传输数据?
docker cp -
修改了容器里某个应用程序对应的配置文件如何让配置文件生效?
重启容器
一、卷的作用
- 数据持久化:容器删除后,数据卷中的数据不会丢失
- 容器间数据共享:多个容器可以挂载同一个数据卷
- 主机与容器数据交互:方便在主机上操作容器数据
- 提升性能:相比容器的可写层,数据卷的读写性能更好
卷就是存放数据的地方
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 数据管理的关键