0%

Docker数据卷

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 # 输出hello

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 # 共享web服务的数据卷
- ./backup:/backup
command: cp -r /data /backup # 备份数据到宿主机

volumes:
web-data: # 定义命名卷

数据卷与其他存储方式的对比

存储方式 特点 适用场景
数据卷(Volume) Docker 管理的宿主机目录,独立于容器,支持命名和共享。 持久化存储、多容器共享数据
绑定挂载(Bind Mount) 直接挂载宿主机任意目录 / 文件,需手动管理路径。 开发环境(实时同步代码)、配置文件挂载
临时文件系统(tmpfs) 数据存储在宿主机内存中,容器删除后丢失。 临时缓存、敏感数据(不持久化)

注意事项

  1. 权限问题:容器内用户(如nginxmysql)可能对挂载的宿主机目录没有读写权限,需提前设置宿主机目录权限(如 chmod 777 /webapp);
  2. Windows/Mac 兼容:在 Windows 和 Mac 系统中,Docker Desktop 会对数据卷路径进行转换,建议使用命名卷避免路径问题;
  3. 避免挂载系统目录:不要将宿主机的//etc等关键目录挂载到容器,可能导致系统故障;
  4. 清理无用卷:定期清理未使用的数据卷(docker volume prune),释放磁盘空间。

总结

数据卷是 Docker 中处理容器数据的核心机制,通过持久化存储、跨容器共享和宿主机交互,解决了容器数据临时化的问题

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10