Docker 数据卷:容器数据的持久化与共享方案
在 Docker 中,容器的文件系统是临时的,当容器被删除时,其内部数据也会丢失。数据卷(Volume) 作为 Docker 提供的持久化存储机制,可实现容器数据的持久化、容器间数据共享以及宿主机与容器间的文件交互,是处理容器数据的核心方案。
数据卷的核心特性
- 持久化存储:数据卷独立于容器生命周期,容器删除后数据仍保留;
- 跨容器共享:多个容器可挂载同一个数据卷,实现数据共享;
- 宿主机与容器互通:宿主机可直接访问数据卷中的文件,方便数据备份和修改;
- 性能优异:数据卷直接映射到宿主机文件系统,避免容器分层文件系统的性能损耗。
数据卷的基本操作
1. 容器内创建数据卷(匿名卷)
通过 docker run -v
命令在容器内创建数据卷(未指定宿主机路径,由 Docker 自动管理):
1 2
| # 在web容器内创建/webapp数据卷(匿名卷) docker run -d -P --name web -v /webapp training/webapp python app.py
|
- 特点:Docker 会在宿主机的
/var/lib/docker/volumes/<随机ID>/_data
目录创建数据卷;
- 适用场景:临时数据存储,无需手动指定宿主机路径。
2. 挂载宿主机目录作为数据卷(绑定挂载)
将宿主机的指定目录挂载到容器内,实现宿主机与容器的文件互通:
1 2
| # 将宿主机的/webapp目录挂载到容器的/opt/webapp目录 docker run -d -P --name web -v /webapp:/opt/webapp training/webapp python app.py
|
- 格式:
-v 宿主机路径:容器内路径[:权限]
;
- 权限控制:可指定读写权限(默认读写),如
-v /webapp:/opt/webapp:ro
表示容器内只读;
- 相对路径:支持相对路径(相对于当前命令执行目录),如
-v ./webapp:/opt/webapp
。
示例:挂载当前目录的html
文件夹到 Nginx 容器,实时修改前端文件:
1 2
| # 宿主机当前目录下的html文件夹映射到Nginx的默认网页目录 docker run -d -p 80:80 --name mynginx -v ./html:/usr/share/nginx/html nginx
|
3. 挂载宿主机文件作为数据卷
除目录外,也可直接挂载宿主机的单个文件到容器(需注意文件权限):
1 2
| # 将宿主机的/etc/hosts文件挂载到容器内,使容器使用宿主机的hosts配置 docker run -it --name test -v /etc/hosts:/etc/hosts centos /bin/bash
|
4. 使用命名卷(推荐)
命名卷是指定名称的数据卷,便于管理和复用(相比匿名卷更易识别):
(1)创建命名卷
1
| docker volume create mydata # 创建名为mydata的数据卷
|
(2)挂载命名卷到容器
1 2
| # 将mydata卷挂载到容器的/data目录 docker run -d --name db -v mydata:/data mysql:8.0
|
(3)查看命名卷详情
1
| docker volume inspect mydata
|
输出示例(包含宿主机实际路径):
1 2 3 4 5 6 7 8 9 10
| [ { "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/mydata/_data", # 宿主机路径 "Name": "mydata", "Options": {}, "Scope": "local" } ]
|
数据卷的高级用法
1. 多容器共享数据卷
多个容器挂载同一个数据卷,实现数据共享:
1 2 3 4 5 6 7 8 9 10
| # 创建数据卷 docker volume create shared-data
# 容器1挂载数据卷(写入数据) docker run -it --name container1 -v shared-data:/data centos /bin/bash # 在容器1中执行:echo "hello" > /data/test.txt
# 容器2挂载同一个数据卷(读取数据) docker run -it --name container2 -v shared-data:/data centos /bin/bash # 在容器2中执行:cat /data/test.txt
|
2. 数据卷备份与恢复
(1)备份数据卷
通过临时容器挂载数据卷和宿主机备份目录,将数据卷内容复制到宿主机:
1 2
| # 备份mydata卷到宿主机的/backup目录 docker run --rm -v mydata:/data -v /backup:/backup centos cp -r /data /backup
|
(2)恢复数据卷
同理,通过临时容器将宿主机备份文件复制到数据卷:
1 2
| # 从/backup目录恢复数据到mydata卷 docker run --rm -v mydata:/data -v /backup:/backup centos cp -r /backup/data/* /data
|
3. Docker Compose 中的数据卷配置
在 docker-compose.yml
中定义数据卷,实现多服务共享:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| version: '3.8'
services: web: image: nginx volumes: - web-data:/usr/share/nginx/html
backup: image: centos volumes: - web-data:/data - ./backup:/backup command: cp -r /data /backup
volumes: web-data:
|
数据卷与其他存储方式的对比
存储方式 |
特点 |
适用场景 |
数据卷(Volume) |
Docker 管理的宿主机目录,独立于容器,支持命名和共享。 |
持久化存储、多容器共享数据 |
绑定挂载(Bind Mount) |
直接挂载宿主机任意目录 / 文件,需手动管理路径。 |
开发环境(实时同步代码)、配置文件挂载 |
临时文件系统(tmpfs) |
数据存储在宿主机内存中,容器删除后丢失。 |
临时缓存、敏感数据(不持久化) |
注意事项
- 权限问题:容器内用户(如
nginx
、mysql
)可能对挂载的宿主机目录没有读写权限,需提前设置宿主机目录权限(如 chmod 777 /webapp
);
- Windows/Mac 兼容:在 Windows 和 Mac 系统中,Docker Desktop 会对数据卷路径进行转换,建议使用命名卷避免路径问题;
- 避免挂载系统目录:不要将宿主机的
/
、/etc
等关键目录挂载到容器,可能导致系统故障;
- 清理无用卷:定期清理未使用的数据卷(
docker volume prune
),释放磁盘空间。
总结
数据卷是 Docker 中处理容器数据的核心机制,通过持久化存储、跨容器共享和宿主机交互,解决了容器数据临时化的问题
v1.3.10