Docker?數(shù)據(jù)目錄遷移的實(shí)現(xiàn)步驟
前言
在使用 Docker 過程中,默認(rèn)數(shù)據(jù)目錄 /var/lib/docker 會(huì)存儲(chǔ)鏡像、容器、卷等所有核心數(shù)據(jù)。隨著業(yè)務(wù)增長(zhǎng),該目錄所在的 /var 分區(qū)可能因空間不足面臨擴(kuò)容壓力,此時(shí)將 Docker 數(shù)據(jù)目錄遷移到更大容量的分區(qū)(如本文中的 /data2/docker/data)是最優(yōu)解決方案。本文將詳細(xì)記錄從準(zhǔn)備工作、數(shù)據(jù)復(fù)制、配置修改到問題排查的完整遷移過程,包含實(shí)操命令和避坑指南,適用于 Ubuntu 及其他 Linux 發(fā)行版。
一、遷移前準(zhǔn)備
1. 環(huán)境確認(rèn)
- 操作系統(tǒng):Ubuntu 22.04.5 LTS
- Docker 版本:28.2.2(客戶端與服務(wù)端版本一致)
- 源數(shù)據(jù)目錄:
/var/lib/docker(默認(rèn)路徑,通過docker info | grep "Docker Root Dir"確認(rèn)) - 目標(biāo)數(shù)據(jù)目錄:
/data2/docker/data(需確保目標(biāo)分區(qū)有足夠空間,本文遷移數(shù)據(jù)量約 260G)
2. 核心工具與命令
systemctl:管理 Docker 服務(wù)啟停cp -a:完整復(fù)制目錄(保留權(quán)限、隱藏文件、元數(shù)據(jù))nano:編輯 Docker 配置文件journalctl:查看 Docker 啟動(dòng)日志(排查錯(cuò)誤)
3. 關(guān)鍵前提
- 遷移前必須停止 Docker 服務(wù)及相關(guān)進(jìn)程,避免數(shù)據(jù)寫入導(dǎo)致復(fù)制不完整
- 目標(biāo)目錄需提前創(chuàng)建并配置正確權(quán)限,確保 Docker 可讀寫
二、詳細(xì)遷移步驟
步驟 1:停止 Docker 服務(wù)(關(guān)鍵!)
Docker 運(yùn)行時(shí)會(huì)持續(xù)讀寫數(shù)據(jù)目錄,遷移前需完全停止服務(wù),同時(shí)停止 docker.socket 防止自動(dòng)激活:
# 停止 Docker 服務(wù) sudo systemctl stop docker # 停止 docker.socket(避免服務(wù)被自動(dòng)激活) sudo systemctl stop docker.socket # 驗(yàn)證狀態(tài)(均顯示 inactive (dead) 即為成功) sudo systemctl status docker sudo systemctl status docker.socket
步驟 2:創(chuàng)建目標(biāo)目錄并配置權(quán)限
目標(biāo)目錄需歸屬 root 用戶(Docker 運(yùn)行用戶),權(quán)限設(shè)置為 701(與默認(rèn)目錄權(quán)限一致):
# 創(chuàng)建目標(biāo)目錄(-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:完整復(fù)制數(shù)據(jù)到目標(biāo)目錄
使用 cp -a 命令復(fù)制數(shù)據(jù),核心是保留所有文件屬性和隱藏內(nèi)容(Docker 依賴大量隱藏元數(shù)據(jù)文件):
# 關(guān)鍵命令:復(fù)制源目錄下所有內(nèi)容(包括隱藏文件和子目錄) sudo cp -a /var/lib/docker/. /data2/docker/data/
命令說明:
- 源路徑使用
/var/lib/docker/.而非/*:*會(huì)忽略隱藏文件(如 overlay2 存儲(chǔ)驅(qū)動(dòng)的.lower元文件),導(dǎo)致數(shù)據(jù)不完整;/.會(huì)復(fù)制目錄下所有內(nèi)容,包括隱藏文件和嵌套子目錄 -a選項(xiàng)等價(jià)于-dR --preserve=all,遞歸復(fù)制、保留符號(hào)鏈接、權(quán)限、所有者、時(shí)間戳,確保數(shù)據(jù)完整性
步驟 4:修改 Docker 配置文件(指定新數(shù)據(jù)目錄)
Docker 通過 /etc/docker/daemon.json 配置數(shù)據(jù)目錄,需添加 data-root 字段指定新路徑:
# 編輯配置文件(不存在則自動(dòng)創(chuàng)建) sudo nano /etc/docker/daemon.json
正確配置內(nèi)容(JSON 格式嚴(yán)格?。?/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ù)目錄
}
配置注意事項(xiàng):
- JSON 格式必須嚴(yán)格:鍵值對(duì)用逗號(hào)分隔,最后一個(gè)鍵值對(duì)后無多余逗號(hào)
- 字符串不能包含換行符、多余引號(hào),否則會(huì)導(dǎo)致 Docker 解析失敗
- 若原有配置包含鏡像源、DNS 等,直接新增
data-root字段即可,無需修改其他配置
步驟 5:?jiǎn)?dòng) Docker 服務(wù)并驗(yàn)證
# 啟動(dòng) Docker 服務(wù)(自動(dòng)拉起 docker.socket) sudo systemctl start docker # 驗(yàn)證服務(wù)狀態(tài)(顯示 active (running) 即為成功) sudo systemctl status docker # 驗(yàn)證新數(shù)據(jù)目錄是否生效 docker info | grep "Docker Root Dir"
預(yù)期輸出:
Docker Root Dir: /data2/docker/data
三、遷移過程中遇到的問題與解決方案
問題 1:誤觸回車鍵是否影響復(fù)制?
現(xiàn)象:
執(zhí)行 sudo cp -a /var/lib/docker/. /data2/docker/data/ 后等待遷移時(shí),誤觸回車鍵。
結(jié)論:
完全不影響!
- 第一次回車已啟動(dòng)
cp復(fù)制進(jìn)程,該進(jìn)程獨(dú)立運(yùn)行,不受后續(xù)空輸入干擾 - 后續(xù)回車鍵僅向終端輸入空行,終端會(huì)忽略無意義輸入,不會(huì)中斷或修改復(fù)制行為
驗(yàn)證方法:
# 查看 cp 進(jìn)程是否正在運(yùn)行 ps aux | grep cp # 查看 IO 負(fù)載,確認(rèn)數(shù)據(jù)傳輸中 sudo apt install -y iotop sudo iotop -o # 顯示正在進(jìn)行 IO 操作的進(jìn)程
問題 2:Docker 啟動(dòng)失敗,日志提示invalid character '\n' in string literal
現(xiàn)象:
執(zhí)行 sudo systemctl start docker 失敗,日志顯示配置文件解析錯(cuò)誤。
原因:
/etc/docker/daemon.json 存在 JSON 語法錯(cuò)誤,具體為:
registry-mirrors數(shù)組結(jié)束后多了多余的逗號(hào)和雙引號(hào)(],")- 字符串中包含非法換行符
解決方案:
修正配置文件語法,刪除多余字符,確保 JSON 格式規(guī)范(參考步驟 4 中的正確配置)。
問題 3:?jiǎn)?dòng)提示Start request repeated too quickly
現(xiàn)象:
Docker 啟動(dòng)后立即失敗,系統(tǒng)反復(fù)重試后放棄,日志顯示該提示。
原因:
核心是 Docker 守護(hù)進(jìn)程(dockerd)啟動(dòng)時(shí)解析配置文件失敗或權(quán)限不足,導(dǎo)致啟動(dòng)流程中斷。
排查步驟:
- 查看詳細(xì)日志定位錯(cuò)誤:
sudo journalctl -u docker.service --since "10 minutes ago"
- 優(yōu)先檢查
daemon.json格式(最常見原因),其次檢查目標(biāo)目錄權(quán)限。
問題 4:復(fù)制數(shù)據(jù)時(shí)提示“沒有那個(gè)文件或目錄”
現(xiàn)象:
執(zhí)行 sudo cp -a /var/lib/docker/* /data2/docker/data/ 時(shí)提示文件不存在。
原因:
* 僅匹配非隱藏的頂層文件/目錄,而 Docker 核心數(shù)據(jù)存儲(chǔ)在子目錄(如 containers、overlay2)中,且可能包含隱藏元文件,導(dǎo)致 * 匹配不到內(nèi)容。
解決方案:
改用 sudo cp -a /var/lib/docker/. /data2/docker/data/ 復(fù)制所有內(nèi)容。
四、遷移后驗(yàn)證與收尾
1. 數(shù)據(jù)完整性驗(yàn)證
遷移成功后需確認(rèn)鏡像、容器、卷等數(shù)據(jù)完整:
# 查看鏡像(應(yīng)與遷移前一致) docker images # 查看所有容器(運(yùn)行中/停止?fàn)顟B(tài)均需正常顯示) docker ps -a # 啟動(dòng)任意舊容器,驗(yàn)證運(yùn)行狀態(tài) docker start <容器ID/名稱> # 查看容器日志,確認(rèn)無異常 docker logs <容器ID/名稱> # 對(duì)比源目錄與目標(biāo)目錄大小(應(yīng)基本一致) sudo du -sh /var/lib/docker sudo du -sh /data2/docker/data
2. 清理舊數(shù)據(jù)(可選)
確認(rèn)遷移后 Docker 運(yùn)行正常,且目標(biāo)目錄數(shù)據(jù)完整后,可刪除舊目錄釋放空間:
# 謹(jǐn)慎操作!僅在驗(yàn)證無誤后執(zhí)行 sudo rm -rf /var/lib/docker
3. 長(zhǎng)期維護(hù)建議
- 定期監(jiān)控目標(biāo)目錄磁盤空間,避免再次出現(xiàn)空間不足問題
- 備份
daemon.json配置文件:sudo cp /etc/docker/daemon.json /etc/docker/daemon.json.bak - 若需再次遷移,可復(fù)用本文流程,核心保持“停止服務(wù)→完整復(fù)制→修改配置→驗(yàn)證”四步
總結(jié)
Docker 數(shù)據(jù)目錄遷移的核心是保證數(shù)據(jù)完整性和配置正確性:
- 必須使用
cp -a或rsync -av復(fù)制數(shù)據(jù),保留文件屬性和隱藏內(nèi)容 daemon.json格式嚴(yán)格遵循 JSON 規(guī)范,避免多余字符和換行- 遷移前停止 Docker 及
docker.socket,遷移后仔細(xì)驗(yàn)證數(shù)據(jù)完整性
本文記錄的遷移過程適用于大多數(shù) Linux 環(huán)境,遇到問題時(shí)優(yōu)先通過 journalctl 查看詳細(xì)日志,90% 的啟動(dòng)失敗都是配置語法錯(cuò)誤或權(quán)限問題導(dǎo)致,針對(duì)性修正即可快速解決。
到此這篇關(guān)于Docker 數(shù)據(jù)目錄遷移的時(shí)間偶像哦啊嗎你直接批的文章就介紹到這了,更多相關(guān)docker 數(shù)據(jù)目錄遷移內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
docker-compose---安裝掛載本地文件啟動(dòng)mariadb問題
這篇文章主要介紹了docker-compose---安裝掛載本地文件啟動(dòng)mariadb問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
Docker容器中查看Python版本的四種方法對(duì)比
在當(dāng)今云原生和微服務(wù)架構(gòu)盛行的時(shí)代,Docker 已成為應(yīng)用部署和開發(fā)的標(biāo)準(zhǔn)工具,確保容器內(nèi) Python 環(huán)境的正確性至關(guān)重要,本文整理了四個(gè)Docker容器中查看Python版本的方法,希望對(duì)大家有所幫助2025-08-08
docker容器與centos宿主機(jī)時(shí)間一致設(shè)置方法
這篇文章主要介紹了docker容器與centos宿主機(jī)時(shí)間一致設(shè)置方法,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-05-05
docker創(chuàng)建私有鏡像倉(cāng)庫(kù)搭建教程
本篇文章主要介紹了docker創(chuàng)建私有鏡像倉(cāng)庫(kù)搭建教程,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-02-02
docker網(wǎng)卡的IP地址修改方法總結(jié)
這篇文章主要給大家總結(jié)介紹了關(guān)于docker網(wǎng)卡的IP地址修改方法,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用docker具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-06-06
docker部署Vaultwarden密碼共享管理系統(tǒng)的實(shí)現(xiàn)(圖文)
Vaultwarden是一個(gè)開源的密碼管理器,它提供了類似于Bitwarden的功能,允許用戶安全地存儲(chǔ)和管理密碼、敏感數(shù)據(jù)和身份信息,本文主要介紹了docker部署Vaultwarden密碼共享管理系統(tǒng)的實(shí)現(xiàn),感興趣的可以了解一下2023-10-10
局域網(wǎng)內(nèi)部署 Docker Registry(推薦)
本文將從創(chuàng)建單機(jī)的 Docker Registry 開始,逐步完成局域網(wǎng)內(nèi)可用的 Docker Registry 的創(chuàng)建,并重點(diǎn)解釋如何使用 IP 地址訪問 Registry 的方法2017-05-05

