Docker 中的数据卷(Volumes)是容器持久化数据的核心机制。它用于在容器之间共享数据、实现数据持久化、解耦宿主机文件系统,非常关键。下面我将从 基础概念、使用方式、命令详解、最佳实践 四个方面完整讲解。
一、什么是 Docker 数据卷(Volume)
Volumes 的作用:
- 容器删除后数据仍然保留
- 多容器共享数据
- 宿主机与容器之间安全读写
- 适配数据库、日志、配置文件等持久化需求
二、三种数据卷类型对比
类型 | 写法 | 持久性 | 推荐用法 |
---|---|---|---|
匿名卷 | -v /data | 有 | 临时挂载 |
具名卷 | -v mydata:/data | 有 | 推荐用于生产持久存储 |
绑定挂载 | -v /host/path:/data | 强依赖宿主 | 配置文件、开发环境调试 |
三、Docker Volume 命令大全
1. 创建卷
docker volume create mydata
2. 查看卷列表
docker volume ls
3. 查看某个卷信息
docker volume inspect mydata
4. 删除卷(卷未被挂载才可删)
docker volume rm mydata
5. 清理所有未使用的卷
docker volume prune
四、使用示例
示例 1:具名卷挂载
docker run -d \
--name mysql \
-v mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.7
卷名为 mysql-data
,数据在 /var/lib/docker/volumes/mysql-data/_data
。
示例 2:绑定宿主机目录
docker run -d \
-v /home/user/nginx/html:/usr/share/nginx/html \
nginx
宿主机目录 /home/user/nginx/html
将映射为容器中的网站根目录。
示例 3:docker-compose 中挂载卷
version: '3'
services:
redis:
image: redis
volumes:
- redis-data:/data
volumes:
redis-data:
五、Volume 挂载时的注意点
情况 | 说明 |
---|---|
容器目录原有数据会消失 | Volume 挂载会覆盖容器内部原始目录内容(除非 Docker 初始化) |
权限问题 | 宿主目录要设好 chmod/chown ,尤其数据库等会要求写权限 |
SELinux/AppArmor 限制 | 某些系统需开启额外策略才能正常挂载主机目录 |
六、Volume 数据位置
具名卷或匿名卷默认存储在:
/var/lib/docker/volumes/<volume_name>/_data
你可以直接进入该目录查看或备份数据(谨慎操作)。
七、最佳实践
场景 | 推荐方式 |
---|---|
数据持久化(MySQL 等) | ✅ 使用具名卷 |
配置文件热更新 | ✅ 使用绑定挂载 |
多容器共享目录 | ✅ 同一个具名卷挂载多个容器 |
避免宿主依赖 | ❌ 不建议生产环境依赖宿主路径 |
补充:使用 init 容器初始化卷(K8s 常见)
如果你用 Kubernetes,也可以让 Init 容器先写入数据到卷,再让主容器读取,非常灵活。
总结
命令或概念 | 用法示例 |
---|---|
创建具名卷 | docker volume create mydata |
查看所有卷 | docker volume ls |
删除卷 | docker volume rm mydata |
挂载具名卷 | -v mydata:/data |
挂载宿主路径 | -v /host/path:/container/path |