Docker 数据卷(Volumes)命令详解
数据卷(Volumes)是 Docker 中持久化存储数据的推荐方式,它独立于容器生命周期,可以高效地在容器间共享数据。以下是 Docker 数据卷相关命令的全面解析:
一、核心概念
数据卷类型
类型 | 存储位置 | 特点 |
---|---|---|
命名卷 | /var/lib/docker/volumes/ | Docker 管理,持久化最佳实践 |
匿名卷 | /var/lib/docker/volumes/ | 自动生成哈希名称,容器删除时保留 |
绑定挂载 | 用户指定宿主机路径 | 直接访问宿主机文件系统 |
tmpfs挂载 | 内存 | 临时存储,容器停止后消失 |
二、基础操作命令
1. 创建数据卷
docker volume create [OPTIONS] [VOLUME_NAME]
- 选项:
--driver
:指定驱动(默认为local
)--label
:添加元数据标签(如--label "env=prod"
)
- 示例:
docker volume create app_data docker volume create --label "type=db" mysql_data
2. 查看数据卷
docker volume ls [OPTIONS]
- 常用选项:
--filter
:按条件过滤(如dangling=true
悬空卷)-q
:仅显示卷名
- 示例:
docker volume ls docker volume ls -q --filter "name=app_"
3. 查看卷详情
docker volume inspect [VOLUME_NAME]
- 输出示例:
[ { "CreatedAt": "2023-05-15T08:00:00Z", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/app_data/_data", "Name": "app_data", "Options": null, "Scope": "local" } ]
4. 删除数据卷
docker volume rm [OPTIONS] VOLUME_NAME [VOLUME_NAME...]
docker volume prune [OPTIONS] # 删除所有未使用的卷
- 选项:
-f
:强制删除(不确认)
- 示例:
docker volume rm app_data docker volume prune -f # 清理所有未使用卷
三、容器与卷的交互
1. 启动容器时挂载卷
docker run -d --name web \
-v app_data:/var/www/html \ # 命名卷
-v /host/path:/container/path \ # 绑定挂载
--mount source=db_data,target=/var/lib/mysql \ # 显式挂载
nginx:latest
2. 挂载类型对比
参数形式 | 示例 | 特点 |
---|---|---|
-v 短格式 | -v myvol:/app/data | 简洁,自动创建卷 |
--mount 长格式 | --mount type=volume,source=myvol,target=/app/data | 更精确的控制选项 |
推荐:生产环境优先使用 --mount ,支持更多配置选项(如只读挂载) |
3. 卷操作选项
# 只读挂载
docker run -v app_data:/app/data:ro ...
# 设置卷驱动选项
docker run --mount source=app_data,target=/app/data,volume-driver=local,volume-opt=type=nfs ...
四、高级操作
1. 备份与恢复卷
# 备份卷数据
docker run --rm -v app_data:/source -v $(pwd):/backup \
alpine tar czf /backup/app_data_$(date +%s).tar.gz -C /source .
# 恢复卷数据
docker run --rm -v app_data:/target -v $(pwd):/backup \
alpine tar xzf /backup/backup_file.tar.gz -C /target
2. 卷驱动扩展
使用 NFS 卷驱动示例:
# 创建NFS卷
docker volume create --driver local \
--opt type=nfs \
--opt device=:/nfs/share \
--opt o=addr=192.168.1.100 \
nfs_volume
# 使用NFS卷
docker run -d --name nfs_app \
--mount source=nfs_volume,target=/app/data \
myapp:latest
3. 查看容器挂载点
docker inspect -f '{{ .Mounts }}' container_name
# 输出示例
[{volume app_data /var/lib/docker/volumes/app_data/_data /app/data local true }]
五、运维最佳实践
1. 数据迁移策略
2. 安全配置
# 限制容器对卷的访问权限
docker run -v app_data:/data:ro ... # 只读挂载
docker run --user 1000:1000 ... # 非root用户运行
# 加密敏感数据卷
docker volume create --driver crypted crypt_vol
3. 监控与维护
# 查看卷磁盘使用情况
docker system df -v
# 定期清理悬空卷(dangling volumes)
docker volume ls -f dangling=true -q | xargs docker volume rm
六、常见问题解决
1. 卷被占用无法删除
# 查找使用卷的容器
docker ps -a --filter volume=VOLUME_NAME
# 强制删除容器和关联卷
docker rm -vf CONTAINER_NAME
2. 权限问题(Permission Denied)
# 临时解决方案(开发环境)
docker run -v /host/path:/container/path:Z ...
# 永久解决方案
chcon -Rt svirt_sandbox_file_t /host/path # SELinux
chmod 777 /host/path # 谨慎使用!
3. 跨主机共享卷
# 使用分布式存储驱动
docker volume create --driver rexray --opt size=10 --opt iops=100 db_vol
七、命令速查表
命令 | 功能 |
---|---|
docker volume create | 创建新卷 |
docker volume ls | 列出所有卷 |
docker volume inspect | 查看卷详细信息 |
docker volume rm | 删除指定卷 |
docker volume prune | 删除所有未使用卷 |
docker run -v name:/path | 挂载卷到容器 |
docker cp container:/path ./ | 从容器复制数据到宿主机 |
docker system df | 查看磁盘使用情况 |
最佳实践提示:
- 生产环境优先使用命名卷(非匿名卷)
- 敏感数据避免使用绑定挂载(bind mounts)
- 定期执行
docker system prune --volumes
清理无用资源- 重要数据卷务必建立备份机制
通过合理使用数据卷,您可以确保容器数据的持久性、安全性和可移植性,构建健壮的 Docker 应用架构。