Docker?數(shù)據(jù)目錄遷移的實現(xiàn)步驟
前言
在使用 Docker 過程中,默認數(shù)據(jù)目錄 /var/lib/docker 會存儲鏡像、容器、卷等所有核心數(shù)據(jù)。隨著業(yè)務增長,該目錄所在的 /var 分區(qū)可能因空間不足面臨擴容壓力,此時將 Docker 數(shù)據(jù)目錄遷移到更大容量的分區(qū)(如本文中的 /data2/docker/data)是最優(yōu)解決方案。本文將詳細記錄從準備工作、數(shù)據(jù)復制、配置修改到問題排查的完整遷移過程,包含實操命令和避坑指南,適用于 Ubuntu 及其他 Linux 發(fā)行版。
一、遷移前準備
1. 環(huán)境確認
- 操作系統(tǒng):Ubuntu 22.04.5 LTS
- Docker 版本:28.2.2(客戶端與服務端版本一致)
- 源數(shù)據(jù)目錄:
/var/lib/docker(默認路徑,通過docker info | grep "Docker Root Dir"確認) - 目標數(shù)據(jù)目錄:
/data2/docker/data(需確保目標分區(qū)有足夠空間,本文遷移數(shù)據(jù)量約 260G)
2. 核心工具與命令
systemctl:管理 Docker 服務啟停cp -a:完整復制目錄(保留權(quán)限、隱藏文件、元數(shù)據(jù))nano:編輯 Docker 配置文件journalctl:查看 Docker 啟動日志(排查錯誤)
3. 關(guān)鍵前提
- 遷移前必須停止 Docker 服務及相關(guān)進程,避免數(shù)據(jù)寫入導致復制不完整
- 目標目錄需提前創(chuàng)建并配置正確權(quán)限,確保 Docker 可讀寫
二、詳細遷移步驟
步驟 1:停止 Docker 服務(關(guān)鍵?。?/h3>
Docker 運行時會持續(xù)讀寫數(shù)據(jù)目錄,遷移前需完全停止服務,同時停止 docker.socket 防止自動激活:
# 停止 Docker 服務 sudo systemctl stop docker # 停止 docker.socket(避免服務被自動激活) sudo systemctl stop docker.socket # 驗證狀態(tài)(均顯示 inactive (dead) 即為成功) sudo systemctl status docker sudo systemctl status docker.socket
步驟 2:創(chuàng)建目標目錄并配置權(quán)限
目標目錄需歸屬 root 用戶(Docker 運行用戶),權(quán)限設置為 701(與默認目錄權(quán)限一致):
# 創(chuàng)建目標目錄(-p 確保父目錄遞歸創(chuàng)建) sudo mkdir -p /data2/docker/data # 配置所有者為 root:root sudo chown -R root:root /data2/docker/data # 配置權(quán)限(保證 root 讀寫權(quán)限,其他用戶可執(zhí)行) sudo chmod -R 701 /data2/docker/data
步驟 3:完整復制數(shù)據(jù)到目標目錄
使用 cp -a 命令復制數(shù)據(jù),核心是保留所有文件屬性和隱藏內(nèi)容(Docker 依賴大量隱藏元數(shù)據(jù)文件):
# 關(guān)鍵命令:復制源目錄下所有內(nèi)容(包括隱藏文件和子目錄) sudo cp -a /var/lib/docker/. /data2/docker/data/
命令說明:
- 源路徑使用
/var/lib/docker/.而非/*:*會忽略隱藏文件(如 overlay2 存儲驅(qū)動的.lower元文件),導致數(shù)據(jù)不完整;/.會復制目錄下所有內(nèi)容,包括隱藏文件和嵌套子目錄 -a選項等價于-dR --preserve=all,遞歸復制、保留符號鏈接、權(quán)限、所有者、時間戳,確保數(shù)據(jù)完整性
步驟 4:修改 Docker 配置文件(指定新數(shù)據(jù)目錄)
Docker 通過 /etc/docker/daemon.json 配置數(shù)據(jù)目錄,需添加 data-root 字段指定新路徑:
# 編輯配置文件(不存在則自動創(chuàng)建) sudo nano /etc/docker/daemon.json
正確配置內(nèi)容(JSON 格式嚴格?。?/p>
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://mirror.ccs.tencentyun.com",
"https://dockerproxy.com"
],
"ipv6": false,
"dns": ["x.x.x.x", "xxx.xxx.xxx.xxx"],
"data-root": "/data2/docker/data" // 核心:指定新數(shù)據(jù)目錄
}
配置注意事項:
- JSON 格式必須嚴格:鍵值對用逗號分隔,最后一個鍵值對后無多余逗號
- 字符串不能包含換行符、多余引號,否則會導致 Docker 解析失敗
- 若原有配置包含鏡像源、DNS 等,直接新增
data-root字段即可,無需修改其他配置
步驟 5:啟動 Docker 服務并驗證
# 啟動 Docker 服務(自動拉起 docker.socket) sudo systemctl start docker # 驗證服務狀態(tài)(顯示 active (running) 即為成功) sudo systemctl status docker # 驗證新數(shù)據(jù)目錄是否生效 docker info | grep "Docker Root Dir"
預期輸出:
Docker Root Dir: /data2/docker/data
三、遷移過程中遇到的問題與解決方案
問題 1:誤觸回車鍵是否影響復制?
現(xiàn)象:
執(zhí)行 sudo cp -a /var/lib/docker/. /data2/docker/data/ 后等待遷移時,誤觸回車鍵。
結(jié)論:
完全不影響!
- 第一次回車已啟動
cp復制進程,該進程獨立運行,不受后續(xù)空輸入干擾 - 后續(xù)回車鍵僅向終端輸入空行,終端會忽略無意義輸入,不會中斷或修改復制行為
驗證方法:
# 查看 cp 進程是否正在運行 ps aux | grep cp # 查看 IO 負載,確認數(shù)據(jù)傳輸中 sudo apt install -y iotop sudo iotop -o # 顯示正在進行 IO 操作的進程
問題 2:Docker 啟動失敗,日志提示invalid character '\n' in string literal
現(xiàn)象:
執(zhí)行 sudo systemctl start docker 失敗,日志顯示配置文件解析錯誤。
原因:
/etc/docker/daemon.json 存在 JSON 語法錯誤,具體為:
registry-mirrors數(shù)組結(jié)束后多了多余的逗號和雙引號(],")- 字符串中包含非法換行符
解決方案:
修正配置文件語法,刪除多余字符,確保 JSON 格式規(guī)范(參考步驟 4 中的正確配置)。
問題 3:啟動提示Start request repeated too quickly
現(xiàn)象:
Docker 啟動后立即失敗,系統(tǒng)反復重試后放棄,日志顯示該提示。
原因:
核心是 Docker 守護進程(dockerd)啟動時解析配置文件失敗或權(quán)限不足,導致啟動流程中斷。
排查步驟:
- 查看詳細日志定位錯誤:
sudo journalctl -u docker.service --since "10 minutes ago"
- 優(yōu)先檢查
daemon.json格式(最常見原因),其次檢查目標目錄權(quán)限。
問題 4:復制數(shù)據(jù)時提示“沒有那個文件或目錄”
現(xiàn)象:
執(zhí)行 sudo cp -a /var/lib/docker/* /data2/docker/data/ 時提示文件不存在。
原因:
* 僅匹配非隱藏的頂層文件/目錄,而 Docker 核心數(shù)據(jù)存儲在子目錄(如 containers、overlay2)中,且可能包含隱藏元文件,導致 * 匹配不到內(nèi)容。
解決方案:
改用 sudo cp -a /var/lib/docker/. /data2/docker/data/ 復制所有內(nèi)容。
四、遷移后驗證與收尾
1. 數(shù)據(jù)完整性驗證
遷移成功后需確認鏡像、容器、卷等數(shù)據(jù)完整:
# 查看鏡像(應與遷移前一致) docker images # 查看所有容器(運行中/停止狀態(tài)均需正常顯示) docker ps -a # 啟動任意舊容器,驗證運行狀態(tài) docker start <容器ID/名稱> # 查看容器日志,確認無異常 docker logs <容器ID/名稱> # 對比源目錄與目標目錄大?。☉疽恢拢? sudo du -sh /var/lib/docker sudo du -sh /data2/docker/data
2. 清理舊數(shù)據(jù)(可選)
確認遷移后 Docker 運行正常,且目標目錄數(shù)據(jù)完整后,可刪除舊目錄釋放空間:
# 謹慎操作!僅在驗證無誤后執(zhí)行 sudo rm -rf /var/lib/docker
3. 長期維護建議
- 定期監(jiān)控目標目錄磁盤空間,避免再次出現(xiàn)空間不足問題
- 備份
daemon.json配置文件:sudo cp /etc/docker/daemon.json /etc/docker/daemon.json.bak - 若需再次遷移,可復用本文流程,核心保持“停止服務→完整復制→修改配置→驗證”四步
總結(jié)
Docker 數(shù)據(jù)目錄遷移的核心是保證數(shù)據(jù)完整性和配置正確性:
- 必須使用
cp -a或rsync -av復制數(shù)據(jù),保留文件屬性和隱藏內(nèi)容 daemon.json格式嚴格遵循 JSON 規(guī)范,避免多余字符和換行- 遷移前停止 Docker 及
docker.socket,遷移后仔細驗證數(shù)據(jù)完整性
本文記錄的遷移過程適用于大多數(shù) Linux 環(huán)境,遇到問題時優(yōu)先通過 journalctl 查看詳細日志,90% 的啟動失敗都是配置語法錯誤或權(quán)限問題導致,針對性修正即可快速解決。
到此這篇關(guān)于Docker 數(shù)據(jù)目錄遷移的時間偶像哦啊嗎你直接批的文章就介紹到這了,更多相關(guān)docker 數(shù)據(jù)目錄遷移內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
docker下遷移elasticsearch問題以及解決方案
文章描述了如何將Elasticsearch數(shù)據(jù)從一個服務器遷移到另一個服務器,包括數(shù)據(jù)掛載、版本一致性、啟動命令的匹配以及可能遇到的權(quán)限和節(jié)點故障問題的解決方法2024-11-11
docker所有常用命令總結(jié)大全(配上思維導圖加圖表顯示)
掌握一些必備的Docker命令對于使用Docker的工程師非常重要,這篇文章主要介紹了docker所有常用命令的相關(guān)資料,文中配上思維導圖加圖表顯示,講解的非常詳細,需要的朋友可以參考下2025-08-08

