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"