1、遷移目標(biāo)
將 Docker 的默認(rèn)存儲(chǔ)目錄(通常是 /var/lib/docker)從舊磁盤遷移到新掛載的磁盤(例如您剛掛載的 /data 目錄)。
2、前提條件
新磁盤(如 /dev/sdb1)已經(jīng)格式化并掛載到了某個(gè)目錄,例如 /data。
確認(rèn) Docker 當(dāng)前的使用狀態(tài)和存儲(chǔ)路徑。
詳細(xì)步驟
第一步:確認(rèn)當(dāng)前 Docker 狀態(tài)和存儲(chǔ)目錄
查看 Docker 當(dāng)前使用的存儲(chǔ)目錄:
sudo docker info | grep "Docker Root Dir"
輸出通常是:Docker Root Dir: /var/lib/docker
停止 Docker 服務(wù):
這是最關(guān)鍵的一步,必須確保 Docker 完全停止,否則數(shù)據(jù)會(huì)損壞。
sudo systemctl stop docker
同時(shí)停止 containerd(如果有)
sudo systemctl stop containerd
驗(yàn)證是否停止:
sudo systemctl status docker
第二步:同步數(shù)據(jù)到新位置
我們使用 rsync 來同步數(shù)據(jù),因?yàn)樗鼙A羲形募?quán)限和屬性,這對(duì)于 Docker 至關(guān)重要。
使用 rsync 復(fù)制數(shù)據(jù)(假設(shè)新掛載點(diǎn)是 /data):
sudo rsync -avxP /var/lib/docker/ /data/docker/
-a:歸檔模式,保留所有屬性(權(quán)限、所有權(quán)、時(shí)間戳等)
-v: verbose,顯示詳細(xì)過程
-x:保持文件系統(tǒng)邊界,不跨越不同文件系統(tǒng)
-P:顯示進(jìn)度,并支持?jǐn)帱c(diǎn)續(xù)傳
這個(gè)過程可能需要一段時(shí)間,取決于 /var/lib/docker 的大小。
第三步:備份并修改 Docker 配置
我們需要告訴 Docker 使用新的存儲(chǔ)位置。
備份原有的 Docker 目錄(重命名而不是刪除,以防萬一):
sudo mv /var/lib/docker /var/lib/docker.bak
創(chuàng)建軟鏈接(Symbolic Link)【推薦方法】:
創(chuàng)建一個(gè)指向新位置的軟鏈接:
sudo ln -s /data/docker /var/lib/docker
驗(yàn)證軟鏈接:
ls -l /var/lib | grep docker
應(yīng)該看到類似 docker -> /data/docker 的輸出。
或者:修改 daemon.json 配置文件【可選方法】:
編輯 Docker 的配置文件:
sudo nano /etc/docker/daemon.json
如果文件不存在,就創(chuàng)建一個(gè)。添加以下內(nèi)容(指定新的數(shù)據(jù)路徑):
json
{
"data-root": "/data/docker"
}
保存并退出。
說明:兩種方法任選其一即可。創(chuàng)建軟鏈接更簡單直觀,與系統(tǒng)耦合度低;修改配置文件是 Docker 官方支持的方式。我個(gè)人更常用軟鏈接方法。
第四步:重啟 Docker 并驗(yàn)證
啟動(dòng) Docker 服務(wù):
sudo systemctl start docker
sudo systemctl start containerd
驗(yàn)證 Docker 服務(wù)狀態(tài)和新存儲(chǔ)路徑:
sudo systemctl status docker # 確保狀態(tài)是 active (running)
sudo docker info | grep "Docker Root Dir" # 確認(rèn)新的路徑是否正確
如果使用軟鏈接,這里顯示的還是 /var/lib/docker,但它實(shí)際指向了 /data/docker。
如果使用修改 daemon.json 的方法,這里會(huì)直接顯示 Docker Root Dir: /data/docker。
驗(yàn)證容器和鏡像是否完好:
sudo docker images # 查看所有鏡像是否都在
sudo docker ps -a # 查看所有容器(包括已停止的)是否都在
嘗試啟動(dòng)一個(gè)之前的容器進(jìn)行測試:
sudo docker start <container_name_or_id>
sudo docker ps # 查看是否運(yùn)行成功
第五步:清理舊數(shù)據(jù)(確認(rèn)無誤后)
非常重要: 只有在確認(rèn) Docker 在新位置運(yùn)行完全正常,所有容器、鏡像、數(shù)據(jù)卷都正確無誤后,才能執(zhí)行這一步。
刪除之前備份的舊數(shù)據(jù)
sudo rm -rf /var/lib/docker.bak
總結(jié):操作流程一覽表
步驟 命令 說明
- 確認(rèn)狀態(tài) docker info | grep "Docker Root Dir" 查看當(dāng)前存儲(chǔ)路徑
- 停止服務(wù) systemctl stop docker containerd 必須停止,防止數(shù)據(jù)損壞
- 同步數(shù)據(jù) rsync -avxP /var/lib/docker/ /data/docker/ 保留權(quán)限復(fù)制數(shù)據(jù)
- 備份舊目錄 mv /var/lib/docker /var/lib/docker.bak 安全起見,先重命名
- 創(chuàng)建軟鏈 ln -s /data/docker /var/lib/docker 讓系統(tǒng)認(rèn)為新目錄就是老地方
- 重啟驗(yàn)證 systemctl start docker 啟動(dòng)服務(wù)
docker images docker ps -a 檢查所有數(shù)據(jù)是否完好 - 清理 rm -rf /var/lib/docker.bak 最終確認(rèn)無誤后再刪除
按照這個(gè)流程,您可以安全無損地將 Docker 的整個(gè)運(yùn)行環(huán)境遷移到新的磁盤上,所有服務(wù)、容器、鏡像、網(wǎng)絡(luò)和卷配置都會(huì)得到保留。