如果要導出 Docker 容器內的 整個目錄(包含所有文件及子目錄),可以使用以下幾種方法:
方法 1:使用 docker cp
直接復制目錄到宿主機
適用場景:容器正在運行或已停止(但未刪除)。
命令格式:
docker cp <容器名或ID>:<容器內目錄路徑> <宿主機目標路徑>
示例(導出 MySQL 容器的 /var/lib/mysql
數據目錄):
docker cp mysql_container:/var/lib/mysql /host/backup/mysql_data
- 說明:
/host/backup/mysql_data
是宿主機上的目標路徑(需提前創建)。- 導出后,宿主機上會得到一個完整的
mysql_data
目錄,包含所有文件。
ps : 也可以將文件復制進容器內部
docker cp <宿主機文件或目錄路徑> <容器名或ID>:<容器內目標路徑>
示例:
復制單個文件到容器的 /tmp 目錄: docker cp /host/path/file.txt mycontainer:/tmp/
復制整個目錄到容器的 /app/data 目錄:docker cp /host/path/folder/ mycontainer:/app/data/
注意:如果目標路徑以 / 結尾(如 /app/data/),Docker 會將目錄內容復制到該路徑下。
如果不以 / 結尾(如 /app/data),Docker 會將整個目錄作為子目錄復制。
方法 2:啟動臨時容器掛載目錄并復制
適用場景:容器已刪除,但數據仍在匿名卷中。
步驟:
- 查找容器的匿名卷:
docker volume ls # 找到與容器關聯的匿名卷(如 `abcd1234...`)
- 啟動臨時容器掛載匿名卷并復制數據:
docker run --rm -v <匿名卷名>:/source -v /host/backup:/backup alpine \sh -c "cp -r /source /backup/mysql_data"
- 示例:
docker run --rm -v abcd1234:/var/lib/mysql -v /home/user/backup:/backup alpine \sh -c "cp -r /var/lib/mysql /backup/mysql_data"
- 示例:
方法 3:通過 docker commit
創建鏡像再導出
適用場景:容器已停止或損壞,但文件系統仍可訪問。
步驟:
- 將容器保存為新鏡像:
docker commit <容器名或ID> temp_mysql_image
- 啟動臨時容器并導出目錄:
docker run --rm -v /host/backup:/backup temp_mysql_image \sh -c "cp -r /var/lib/mysql /backup/mysql_data"
- 清理臨時鏡像:
docker rmi temp_mysql_image
方法 4:直接訪問 Docker 存儲驅動數據(高級)
適用場景:容器已刪除且無匿名卷,但數據仍在 Docker 存儲目錄中(如 overlay2
)。
步驟:
- 找到容器的存儲層:
docker inspect <容器名或ID> | grep "MergeDir"
- 輸出類似:
"MergeDir": "/var/lib/docker/overlay2/abcd1234/merged"
- 輸出類似:
- 直接復制數據:
cp -r /var/lib/docker/overlay2/<容器ID>/merged/var/lib/mysql /host/backup/mysql_data
- 注意:需 root 權限,且路徑因 Docker 存儲驅動而異(如
overlay2
、aufs
)。
- 注意:需 root 權限,且路徑因 Docker 存儲驅動而異(如
驗證導出的數據
檢查宿主機上的目錄結構和文件:
ls -l /host/backup/mysql_data
- 如果導出的是 MySQL 數據,應能看到
.ibd
、.frm
等文件。
如何避免未來數據丟失?
- 始終掛載數據卷:
docker run -v /host/mysql_data:/var/lib/mysql mysql
- 使用命名卷(Docker 自動管理):
docker run -v mysql_data:/var/lib/mysql mysql
- 定期備份:
docker exec mysql_container sh -c 'mysqldump -u root -p$MYSQL_ROOT_PASSWORD --all-databases > /backup.sql' docker cp mysql_container:/backup.sql /host/backup.sql
總結表格
方法 | 適用場景 | 命令示例 |
---|---|---|
docker cp | 容器仍在運行或存在 | docker cp mysql:/var/lib/mysql /backup |
匿名卷掛載 | 容器已刪除但卷存在 | docker run --rm -v <卷名>:/source -v /backup:/backup alpine cp -r /source /backup |
docker commit | 容器損壞但文件系統可讀 | docker commit + 臨時容器復制 |
直接訪問存儲層 | 緊急恢復(需 root 權限) | 從 /var/lib/docker/overlay2/<ID>/merged 復制數據 |
選擇最適合你場景的方法,確保數據安全! 🔐