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

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

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


確保容器、鏡像、數(shù)據(jù)卷等一切正常。
八、清理舊目錄(確認(rèn)無(wú)誤后)
要確認(rèn) Docker 是否仍在使用 /var/lib/docker 目錄,可以從 配置檢查 + 活動(dòng)檢查 + 掛載路徑檢查 三個(gè)層面來(lái)判斷。
檢查 Docker 當(dāng)前數(shù)據(jù)目錄配置
docker info | grep "Docker Root Dir"
例如輸出:
Docker Root Dir: /opt/docker
- 如果顯示為
/var/lib/docker→ 說(shuō)明仍在使用舊目錄。 - 如果顯示為其他路徑(如
/opt/docker)→ 說(shuō)明已經(jīng)遷移成功,Docker 正在用新路徑。
確認(rèn) /var/lib/docker 是否還有文件被訪問(wèn)(實(shí)時(shí)檢測(cè))
可以使用以下方式來(lái)檢測(cè)該目錄是否仍在被 Docker 訪問(wèn):
使用 lsof 查看是否有進(jìn)程打開(kāi)了該目錄文件:
sudo lsof +D /var/lib/docker
- 如果輸出很多項(xiàng) → 有程序(很可能是 Docker)還在訪問(wèn)該目錄。
- 如果無(wú)輸出 → 當(dāng)前沒(méi)有任何進(jìn)程使用
/var/lib/docker。
或者查看是否有掛載點(diǎn):
mount | grep /var/lib/docker
如果該路徑有掛載(如 overlay、aufs、tmpfs 等),則說(shuō)明仍然在使用。
使用 du 對(duì)新路徑進(jìn)行核查對(duì)比(判斷是否數(shù)據(jù)已遷移)
假設(shè)你遷移到了 /opt/docker:
sudo du -sh /opt/docker
- 如果
/opt/docker顯示接近 45G,說(shuō)明遷移后的路徑也包含完整數(shù)據(jù); - 如果
/opt/docker只有幾百 MB,而/var/lib/docker仍然 45G,那說(shuō)明 Docker 還在用舊目錄,或者遷移不完整。
查看 Docker 配置文件 daemon.json
cat /etc/docker/daemon.json
確認(rèn)里面有如下配置,并且路徑與你預(yù)期一致:
{
"data-root": "/opt/docker"
}
如果此配置不存在,Docker 默認(rèn)仍使用 /var/lib/docker
重啟后再次確認(rèn)(配置生效關(guān)鍵)
如果你修改了 daemon.json 但沒(méi)有重啟 Docker,舊路徑可能仍被使用。
確保你執(zhí)行了:
sudo systemctl restart docker
然后重新執(zhí)行 docker info 確認(rèn)是否已生效。
最終判斷標(biāo)準(zhǔn)(是否可安全刪除 /var/lib/docker):
可以放心清理 /var/lib/docker 的前提條件:
| 條件 | 符合說(shuō)明 |
|---|---|
| docker info 顯示 Docker Root Dir 為新路徑(如 /opt/docker) | ? |
| lsof +D /var/lib/docker 無(wú)任何輸出 | ? |
| mount為空 | ? |
| /opt/docker 占用空間基本等于 /var/lib/docker | ? |
| 所有容器、鏡像、網(wǎng)絡(luò)、卷運(yùn)行無(wú)異常 | ? |
滿足以上條件,就可以安全刪除 /var/lib/docker。
數(shù)據(jù)驗(yàn)證無(wú)誤后,可以刪除舊目錄釋放磁盤(pán)空間:
sudo rm -rf /var/lib/docker
常見(jiàn)問(wèn)題 FAQ
遷移過(guò)程中可以不停機(jī)嗎?
不能。Docker 必須停止服務(wù),否則正在運(yùn)行的容器或鏡像文件可能處于寫(xiě)入狀態(tài),遷移將造成數(shù)據(jù)不一致或損壞。
如果遷移失敗,可以恢復(fù)嗎?
完全可以。原目錄 /var/lib/docker 沒(méi)有刪除前,可隨時(shí)回退:
# 修改 daemon.json 改回原路徑
{
"data-root": "/var/lib/docker"
}
# 重啟 Docker
sudo systemctl restart docker
總結(jié)
通過(guò)合理遷移 Docker 根目錄,可以有效釋放根分區(qū)壓力,將大量容器與鏡像數(shù)據(jù)遷移到更大更合理的掛載路徑上。
遷移核心步驟:
- 清理無(wú)用資源(推薦)
- 停止 Docker 服務(wù)
- 使用 rsync 拷貝數(shù)據(jù)
- 修改配置文件指向新目錄
- 重啟 Docker 并驗(yàn)證運(yùn)行正常
- 刪除舊目錄釋放空間
以上就是將Docker的根目錄遷移到其他掛載盤(pán)詳細(xì)流程的詳細(xì)內(nèi)容,更多關(guān)于Docker根目錄遷移的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Docker目錄遷移的詳細(xì)執(zhí)行步驟(按腳本流程)
- docker 數(shù)據(jù)目錄遷移的兩種實(shí)現(xiàn)方法
- Docker根目錄遷移與滾動(dòng)日志設(shè)置方法
- Docker目錄遷移的實(shí)現(xiàn)示例
- 遷移變更Docker默認(rèn)數(shù)據(jù)存儲(chǔ)目錄的步驟詳解
- docker存儲(chǔ)目錄遷移示例教程
- docker安裝目錄遷移的兩種常用方法
- Docker數(shù)據(jù)目錄遷移方法詳解
- docker遷移數(shù)據(jù)目錄的方法步驟
- Docker?數(shù)據(jù)目錄遷移的實(shí)現(xiàn)步驟
相關(guān)文章
docker運(yùn)行nginx容器并掛載數(shù)據(jù)卷
本文主要介紹了docker運(yùn)行nginx容器,并通過(guò)掛載目錄將容器與宿主機(jī)的數(shù)據(jù)進(jìn)行共享和統(tǒng)一管理,具有一定的參考價(jià)值,感興趣的可以了解一下2025-03-03
Gogs+Jenkins+Docker 自動(dòng)化部署.NetCore的方法步驟
這篇文章主要介紹了Gogs+Jenkins+Docker 自動(dòng)化部署.NetCore,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-06-06
centos下docker安裝及springboot遠(yuǎn)程發(fā)布docker的方法
這篇文章主要介紹了centos下docker安裝及springboot遠(yuǎn)程發(fā)布docker的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04
解決docker使用GDB,無(wú)法進(jìn)入斷點(diǎn)的問(wèn)題
這篇文章主要介紹了解決docker使用GDB,無(wú)法進(jìn)入斷點(diǎn)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11

