將Docker的根目錄遷移到其他掛載盤的詳細流程
在使用 Docker 的過程中,你是否遇到過類似問題:
“服務器磁盤告警,發(fā)現(xiàn) /var/lib/docker 目錄已經占用了 80G+ 的空間!”
Docker 默認將所有容器、鏡像、數據卷等內容存放在 /var/lib/docker 下,隨著業(yè)務增長,該目錄很容易撐爆根分區(qū)。
本文將教你如何將 Docker 的根目錄遷移到其他掛載盤(如 /opt/docker),并保持原有容器、鏡像、數據卷不丟失。
適用場景
/var/lib/docker占用空間太大,影響系統(tǒng)運行- 服務器掛載了大容量的數據盤或獨立磁盤目錄(如
/opt、/data) - 想保持已有容器鏡像數據不丟失
操作概覽
推薦使用 rsync 安全遷移,并通過配置 data-root 修改 Docker 根目錄
一、遷移前清理無用數據(推薦)
遷移前可以清理以下資源,減少磁盤占用和遷移時間:
- 已退出的容器
- 未使用的鏡像(如
<none>) - 構建緩存
- 未掛載的卷
磁盤使用情況命令:
du -h --max-depth=1 /var/lib/
推薦清理命令:
docker system prune -a --volumes
也可以按模塊逐個清理:
docker container prune # 清理已退出容器 docker image prune -a # 刪除懸空鏡像 docker volume prune # 清理未使用的卷 docker network prune # 清理未使用的網絡
注意事項:
清理操作不可恢復,請確保不再使用的資源才執(zhí)行
清理前可用如下命令預覽:
docker images -f dangling=true docker volume ls -f dangling=true docker ps -a
二、確認當前 Docker 根目錄
docker info | grep 'Docker Root Dir'
輸出示例:
Docker Root Dir: /var/lib/docker
三、停止 Docker 服務(必須)
遷移數據前必須停掉 Docker,避免文件寫入不一致:
sudo systemctl stop docker
可選(有 containerd 的話):
sudo systemctl stop containerd
四、使用 rsync 安全復制 Docker 目錄
推薦使用 rsync,保持文件權限、符號鏈接等:
sudo rsync -aAXHv --progress /var/lib/docker/ /opt/docker/
參數說明:
| 參數 | 作用 |
|---|---|
| -aAXH | 保留文件權限、ACL、符號鏈接、硬鏈接等 |
| --progress | 顯示復制進度 |
| / 結尾 | 表示復制目錄 內容 而不是目錄本身 |
遷移完成:

五、修改 Docker 配置文件
編輯 /etc/docker/daemon.json,添加或修改如下配置:
{
"data-root": "/opt/docker"
}
如果該文件不存在,可直接創(chuàng)建。
六、重啟 Docker 服務
sudo systemctl start docker
七、驗證遷移是否成功
docker info | grep 'Docker Root Dir'
輸出應為:
Docker Root Dir: /opt/docker

再執(zhí)行:
docker ps -a docker images


確保容器、鏡像、數據卷等一切正常。
八、清理舊目錄(確認無誤后)
要確認 Docker 是否仍在使用 /var/lib/docker 目錄,可以從 配置檢查 + 活動檢查 + 掛載路徑檢查 三個層面來判斷。
檢查 Docker 當前數據目錄配置
docker info | grep "Docker Root Dir"
例如輸出:
Docker Root Dir: /opt/docker
- 如果顯示為
/var/lib/docker→ 說明仍在使用舊目錄。 - 如果顯示為其他路徑(如
/opt/docker)→ 說明已經遷移成功,Docker 正在用新路徑。
確認 /var/lib/docker 是否還有文件被訪問(實時檢測)
可以使用以下方式來檢測該目錄是否仍在被 Docker 訪問:
使用 lsof 查看是否有進程打開了該目錄文件:
sudo lsof +D /var/lib/docker
- 如果輸出很多項 → 有程序(很可能是 Docker)還在訪問該目錄。
- 如果無輸出 → 當前沒有任何進程使用
/var/lib/docker。
或者查看是否有掛載點:
mount | grep /var/lib/docker
如果該路徑有掛載(如 overlay、aufs、tmpfs 等),則說明仍然在使用。
使用 du 對新路徑進行核查對比(判斷是否數據已遷移)
假設你遷移到了 /opt/docker:
sudo du -sh /opt/docker
- 如果
/opt/docker顯示接近 45G,說明遷移后的路徑也包含完整數據; - 如果
/opt/docker只有幾百 MB,而/var/lib/docker仍然 45G,那說明 Docker 還在用舊目錄,或者遷移不完整。
查看 Docker 配置文件 daemon.json
cat /etc/docker/daemon.json
確認里面有如下配置,并且路徑與你預期一致:
{
"data-root": "/opt/docker"
}
如果此配置不存在,Docker 默認仍使用 /var/lib/docker
重啟后再次確認(配置生效關鍵)
如果你修改了 daemon.json 但沒有重啟 Docker,舊路徑可能仍被使用。
確保你執(zhí)行了:
sudo systemctl restart docker
然后重新執(zhí)行 docker info 確認是否已生效。
最終判斷標準(是否可安全刪除 /var/lib/docker):
可以放心清理 /var/lib/docker 的前提條件:
| 條件 | 符合說明 |
|---|---|
| docker info 顯示 Docker Root Dir 為新路徑(如 /opt/docker) | ? |
| lsof +D /var/lib/docker 無任何輸出 | ? |
| mount為空 | ? |
| /opt/docker 占用空間基本等于 /var/lib/docker | ? |
| 所有容器、鏡像、網絡、卷運行無異常 | ? |
滿足以上條件,就可以安全刪除 /var/lib/docker。
數據驗證無誤后,可以刪除舊目錄釋放磁盤空間:
sudo rm -rf /var/lib/docker
常見問題 FAQ
遷移過程中可以不停機嗎?
不能。Docker 必須停止服務,否則正在運行的容器或鏡像文件可能處于寫入狀態(tài),遷移將造成數據不一致或損壞。
如果遷移失敗,可以恢復嗎?
完全可以。原目錄 /var/lib/docker 沒有刪除前,可隨時回退:
# 修改 daemon.json 改回原路徑
{
"data-root": "/var/lib/docker"
}
# 重啟 Docker
sudo systemctl restart docker
總結
通過合理遷移 Docker 根目錄,可以有效釋放根分區(qū)壓力,將大量容器與鏡像數據遷移到更大更合理的掛載路徑上。
遷移核心步驟:
- 清理無用資源(推薦)
- 停止 Docker 服務
- 使用 rsync 拷貝數據
- 修改配置文件指向新目錄
- 重啟 Docker 并驗證運行正常
- 刪除舊目錄釋放空間
以上就是將Docker的根目錄遷移到其他掛載盤詳細流程的詳細內容,更多關于Docker根目錄遷移的資料請關注腳本之家其它相關文章!
相關文章
Docker搭建Zookeeper&Kafka集群的實現(xiàn)
這篇文章主要介紹了Docker搭建Zookeeper&Kafka集群的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-08-08
docker?部署hbase并且java?Api連接的操作過程
這篇文章主要介紹了docker?部署hbase并且java?Api連接的操作過程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2023-11-11

