1. 基础概念
Docker卷是专门用于持久化容器数据的存储方案,独立于容器生命周期。其核心优势包括:
- 数据持久化:容器删除后数据仍保留
- 跨容器共享:多个容器可访问同一卷
- 备份与迁移:支持直接复制卷数据
- 驱动支持:可对接云存储(如AWS S3)
2. 卷类型详解
类型 | 示例 | 特性 |
---|---|---|
命名卷 | my_data | 由Docker管理,存储在/var/lib/docker/volumes/ |
匿名卷 | 随机ID | 容器删除时自动清理(需配合--rm ) |
绑定挂载 | /host/path:/container/path | 手动指定主机目录,性能最优 |
3. 常用命令详解
docker volume create
# 创建命名卷
docker volume create my_data# 指定驱动(需安装对应插件)
docker volume create --driver local --opt type=nfs --opt device=:/nfs/share my_nfs
docker volume inspect
# 查看卷详细信息
docker volume inspect my_data# 输出格式化结果
docker volume inspect --format '{{.Mountpoint}}' my_data
docker volume rm
# 删除未使用的卷
docker volume rm my_data# 强制删除正在使用的卷(需配合`-f`)
docker volume rm -f my_data
docker volume prune
# 清理所有未使用的卷
docker volume prune# 交互式确认删除
docker volume prune -f
4. 基础操作示例
创建并挂载卷
# 创建命名卷
docker volume create app_data# 运行容器并挂载卷
docker run -d \--name web \-v app_data:/app/data \nginx:latest
绑定主机目录
# 将主机目录挂载到容器(需手动管理权限)
docker run -d \--name mysql \-v /host/mysql_data:/var/lib/mysql \-e MYSQL_ROOT_PASSWORD=secret \mysql:5.7
备份卷数据
# 导出卷数据到主机
docker run --rm \-v app_data:/source \-v /host/backup:/target \ubuntu tar czf /target/backup.tar.gz -C /source .
5. 高级用法
卷共享
# 多个容器共享同一卷
docker run -d --name worker1 -v app_data:/app busybox sleep 3600
docker run -d --name worker2 -v app_data:/app busybox sleep 3600
卷迁移
# 导出卷数据
docker run --rm -v app_data:/source busybox tar czf - /source > backup.tar.gz# 导入到新卷
docker volume create new_app_data
docker run --rm -v new_app_data:/target busybox sh -c "tar xzf - -C /target" < backup.tar.gz
自动清理策略
# 配置Docker删除未使用的卷(需修改daemon.json)
{"volumes": {"autoPrune": true,"pruneInterval": "1h"}
}
卷驱动扩展
# 使用云存储驱动(示例为AWS S3)
docker volume create --driver convoy --opt bucket=my-bucket my_s3_volume
6. 验证卷状态
查看卷使用情况
# 列出所有卷
docker volume ls# 过滤已使用卷
docker volume ls --filter "dangling=false"
检查卷空间占用
# 查看卷存储路径
docker volume inspect --format '{{.Mountpoint}}' my_data# 使用du命令检查空间
sudo du -sh /var/lib/docker/volumes/my_data/_data
验证数据完整性
# 在容器内写入测试数据
docker exec web sh -c "echo 'test' > /app/data/file.txt"# 从主机读取验证
sudo cat /var/lib/docker/volumes/my_data/_data/file.txt
7. 常见问题解决
问题1:卷无法删除
Error response from daemon: remove <卷名>: volume is in use and cannot be removed
解决方案:
- 确认容器状态:
docker ps -a | grep <卷名>
- 停止并删除关联容器:
docker stop $(docker ps -q --filter "volume=<卷名>") docker rm -v $(docker ps -aq --filter "volume=<卷名>")
问题2:绑定挂载权限错误
Error: failed to start container: Permission denied
解决方案:
- 调整主机目录权限:
sudo chmod 777 /host/path sudo chown $USER:$USER /host/path
问题3:卷数据丢失
Error: file not found in container
解决方案:
- 检查卷挂载路径是否正确:
docker inspect web | grep "Mounts" -A 5
- 恢复备份:
docker run --rm -v new_app_data:/target busybox sh -c "tar xzf - -C /target" < backup.tar.gz
问题4:卷驱动不可用
Error response from daemon: create my_s3_volume: Driver <驱动名> not found
解决方案:
- 安装对应驱动插件:
docker plugin install convoy --alias convoy-s3
8. 最佳实践
- 命名规范:使用有意义的卷名(如
app_logs
而非vol1
) - 定期备份:结合cron任务自动备份关键卷
- 权限控制:绑定挂载时避免使用
777
权限 - 资源监控:使用
du -sh
定期检查大体积卷 - 标签管理:为生产环境卷添加标签:
docker volume create --label env=prod --label app=web my_prod_data
9. 示例流程
# 1. 创建并挂载卷
docker volume create web_assets
docker run -d --name static -v web_assets:/usr/share/nginx/html nginx:latest# 2. 上传静态文件到卷
docker cp ./assets/* static:/usr/share/nginx/html# 3. 备份卷数据
docker run --rm -v web_assets:/source busybox tar czf - /source > web_assets_$(date +%Y%m%d).tar.gz# 4. 迁移卷到新环境
scp web_assets_20250814.tar.gz user@new-host:/backup
ssh user@new-host "docker volume create web_assets_new && cat /backup/web_assets_20250814.tar.gz | docker run --rm -i -v web_assets_new:/target busybox tar xzf - -C /target"