Docker數(shù)據(jù)持久化之如何讓新容器同步舊數(shù)據(jù)詳解
適合人群:剛接觸 Docker 的 Java / 后端開(kāi)發(fā)者
目標(biāo):徹底理解 -v 數(shù)據(jù)卷的作用、數(shù)據(jù)保存機(jī)制,以及容器刪除后數(shù)據(jù)為什么不丟
一、Docker 的容器與數(shù)據(jù)之間的關(guān)系
我們先來(lái)理解一個(gè)關(guān)鍵概念:
Docker 容器 ≠ 數(shù)據(jù)庫(kù)本身。
可以把 Docker 想象成一個(gè)“小房子”:
- 房子里裝著程序(比如 MySQL、Redis);
- 數(shù)據(jù)(比如數(shù)據(jù)庫(kù)表)其實(shí)放在房子里面的“儲(chǔ)物柜”里。
當(dāng)你執(zhí)行:
docker run -di --name mysql8.0 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:8.0
你只是建了個(gè)房子(容器),而數(shù)據(jù)默認(rèn)存在房子里面的 /var/lib/mysql 目錄下。
問(wèn)題是:
當(dāng)你把這個(gè)容器刪掉時(shí)(docker rm -f mysql8.0),房子和里面的數(shù)據(jù)儲(chǔ)物柜都會(huì)一起被“炸掉”,數(shù)據(jù)全沒(méi)。
二、解決辦法:用-v數(shù)據(jù)卷掛載
Docker 提供了一個(gè)“外 掛儲(chǔ)物柜”的功能,叫 數(shù)據(jù)卷(Volume)。
舉個(gè)例子:
docker run -di \ --name=mysql8.0 \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=root \ -v ~/docker/mysql/data:/var/lib/mysql \ mysql:8.0
這里的 -v 參數(shù)代表:
Mac宿主機(jī)路徑 : 容器內(nèi)部路徑
即:
- 你的 Mac 上的
~/docker/mysql/data文件夾 - 實(shí)際上掛載到了容器里的
/var/lib/mysql
這意味著:
不管容器如何刪、重建,~/docker/mysql/data 的內(nèi)容都不會(huì)被刪除,數(shù)據(jù)會(huì)一直保留在宿主機(jī)上。
三、驗(yàn)證實(shí)驗(yàn):刪容器后數(shù)據(jù)還在!
下面我們來(lái)做個(gè)小實(shí)驗(yàn):
Step 1. 創(chuàng)建容器
docker run -di \ --name=mysql8.0 \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=root \ -v ~/docker/mysql/data:/var/lib/mysql \ mysql:8.0
Step 2. 進(jìn)入容器創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)
docker exec -it mysql8.0 mysql -uroot -proot CREATE DATABASE testdb;
Step 3. 刪除容器
docker rm -f mysql8.0
Step 4. 查看宿主機(jī)目錄
ls ~/docker/mysql/data
你會(huì)看到很多 .ibd、.frm、testdb 文件夾還在。
說(shuō)明數(shù)據(jù)沒(méi)有被刪除!
四、重新創(chuàng)建容器,數(shù)據(jù)還能“復(fù)活”!
現(xiàn)在我們重新啟動(dòng)一個(gè)新容器,但繼續(xù)掛載同一個(gè)路徑:
docker run -di \ --name=mysql_new \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=root \ -v ~/docker/mysql/data:/var/lib/mysql \ mysql:8.0
然后進(jìn)入新容器:
docker exec -it mysql_new mysql -uroot -proot SHOW DATABASES;
你會(huì)驚喜地發(fā)現(xiàn) ——上次創(chuàng)建的 testdb 數(shù)據(jù)庫(kù)還在!
五、原理解釋?zhuān)簽槭裁葱氯萜髂芡脚f數(shù)據(jù)?
這是因?yàn)椋?/p>
-v參數(shù)讓容器內(nèi)部的/var/lib/mysql與宿主機(jī)的文件夾建立了“實(shí)時(shí)映射關(guān)系”;- 容器只是“使用”那里的數(shù)據(jù)文件,并不會(huì)直接擁有;
- 刪除容器只會(huì)刪除容器本身的鏡像層,不會(huì)影響宿主機(jī)的文件。
換句話(huà)說(shuō):
數(shù)據(jù)卷是“獨(dú)立存在的外部存儲(chǔ)”,容器只是臨時(shí)使用它。
六、同樣適用于 Redis、Elasticsearch 等服務(wù)
| 服務(wù) | 掛載命令 | 容器內(nèi)默認(rèn)路徑 | 推薦宿主機(jī)路徑 |
|---|---|---|---|
| MySQL | -v ~/docker/mysql/data:/var/lib/mysql | /var/lib/mysql | ~/docker/mysql/data |
| Redis | -v ~/docker/redis/data:/data | /data | ~/docker/redis/data |
| Elasticsearch | -v ~/docker/es/data:/usr/share/elasticsearch/data | /usr/share/elasticsearch/data | ~/docker/es/data |
| Jenkins | -v ~/docker/jenkins:/var/jenkins_home | /var/jenkins_home | ~/docker/jenkins |
| MinIO | -v ~/docker/minio/data:/data | /data | ~/docker/minio/data |
這些路徑同理:只要掛載過(guò),再建容器掛載相同路徑 → 數(shù)據(jù)自然“同步回來(lái)”。
七、額外提示:查看掛載信息
想看某個(gè)容器的掛載狀態(tài):
docker inspect 容器名 | grep Mounts -A 10
可以看到類(lèi)似:
"Mounts": [
{
"Type": "bind",
"Source": "/Users/yourname/docker/mysql/data",
"Destination": "/var/lib/mysql"
}
]
這就說(shuō)明你的數(shù)據(jù)卷掛載成功。
八、小白總結(jié)一圖流
無(wú) -v 掛載:
[容器]——數(shù)據(jù)放在容器內(nèi)(刪容器=刪數(shù)據(jù))
有 -v 掛載:
[容器]←→[宿主機(jī)文件夾](刪容器≠刪數(shù)據(jù))
重新啟動(dòng)時(shí):
新容器 ←→ [同一個(gè)宿主機(jī)路徑] → 數(shù)據(jù)自動(dòng)同步回來(lái) ?
九、日常使用建議
| 場(chǎng)景 | 建議做法 |
|---|---|
| 本地開(kāi)發(fā) | 一定要掛載 -v 保存數(shù)據(jù) |
| 測(cè)試環(huán)境 | 可選擇性?huà)燧d |
| 生產(chǎn)環(huán)境 | 統(tǒng)一放在掛載卷或 NFS 存儲(chǔ)上 |
| 容器遷移 | 拷貝宿主機(jī)對(duì)應(yīng)路徑即可恢復(fù)數(shù)據(jù) |
十、總結(jié)一句話(huà)
沒(méi)有 -v,容器刪了數(shù)據(jù)也沒(méi)了;
有了 -v,數(shù)據(jù)存在宿主機(jī)目錄中,刪容器也不影響。
只要新容器掛載相同目錄,數(shù)據(jù)就能“原地復(fù)活”。
延伸閱讀
Docker 官方文檔:https://docs.docker.com/storage/volumes/
推薦命令:
docker volume ls # 查看所有數(shù)據(jù)卷 docker volume inspect 卷名 docker system df # 查看磁盤(pán)空間占用
到此這篇關(guān)于Docker數(shù)據(jù)持久化之如何讓新容器同步舊數(shù)據(jù)詳解的文章就介紹到這了,更多相關(guān)Docker新容器同步舊數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Docker部署Logstash同步Mysql數(shù)據(jù)到ES方式
- docker之MySQL同步數(shù)據(jù)的實(shí)現(xiàn)
- docker實(shí)現(xiàn)MySQL數(shù)據(jù)同步的方法
- docker 容器數(shù)據(jù)在盤(pán)與盤(pán)之間遷移方法
- docker容器間進(jìn)行數(shù)據(jù)共享的三種實(shí)現(xiàn)方式
- Docker 容器通信與數(shù)據(jù)持久化問(wèn)題及注意事項(xiàng)
- Docker 數(shù)據(jù)持久化的三種方式小結(jié)
- 詳解Docker的持久化存儲(chǔ)和數(shù)據(jù)共享
- 淺談Docker數(shù)據(jù)持久化
相關(guān)文章
docker部署xxl-job-admin出現(xiàn)數(shù)據(jù)庫(kù)拒絕問(wèn)題及解決方法
這篇文章主要介紹了docker部署xxl-job-admin出現(xiàn)數(shù)據(jù)庫(kù)拒絕問(wèn)題,本文給大家分享正確的解決思路,對(duì)docker部署xxl-job-admin相關(guān)知識(shí)感興趣的朋友一起看看吧2023-02-02
淺談Docker Desktop for Linux和Docker Engine
本文主要介紹了Docker Desktop for Linux和Docker Engine區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10
單機(jī)docker-compose部署minio過(guò)程
簡(jiǎn)述通過(guò)Docker-Compose在單機(jī)上掛載多硬盤(pán)實(shí)現(xiàn)MinIO多副本部署的方法,包括配置docker-compose.yaml和nginx.conf等關(guān)鍵步驟,適合服務(wù)器資源有限的場(chǎng)景2024-10-10
Docker部署PostgreSQL數(shù)據(jù)庫(kù)及操作方法詳解
這篇文章主要介紹了Docker部署PostgreSQL數(shù)據(jù)庫(kù)及操作方法的相關(guān)資料,包括拉取鏡像、運(yùn)行容器、設(shè)置參數(shù)以及查看運(yùn)行狀態(tài),通過(guò)這些步驟讀者可以輕松在本地搭建并運(yùn)行PostgreSQL數(shù)據(jù)庫(kù),需要的朋友可以參考下2025-04-04
利用寶塔面板和docker快速部署網(wǎng)站的基本流程
當(dāng)你有了一臺(tái)服務(wù)器,就會(huì)折騰往這臺(tái)服務(wù)器上部署各種好玩的網(wǎng)站,本文將以部署filebrowser舉例介紹網(wǎng)站部署的基本流程,感興趣的朋友一起看看吧2023-12-12
Docker鏡像的默認(rèn)存儲(chǔ)位置及修改步驟
Docker鏡像默認(rèn)存儲(chǔ)在?/var/lib/docker?目錄下,在Linux系統(tǒng)中,這個(gè)目錄通常是在根目錄下,可以使用相應(yīng)命令查看,下面給大家介紹Docker鏡像的默認(rèn)存儲(chǔ)位置及修改步驟,感興趣的朋友一起看看吧2024-06-06
Docker安裝Oracle創(chuàng)建表空間并導(dǎo)入數(shù)據(jù)庫(kù)完整步驟
Docker提供了一種簡(jiǎn)便的方式,通過(guò)容器化我們可以在任何支持Docker 的環(huán)境中快速部署Oracle數(shù)據(jù)庫(kù),這篇文章主要介紹了Docker安裝Oracle創(chuàng)建表空間并導(dǎo)入數(shù)據(jù)庫(kù)的相關(guān)資料,需要的朋友可以參考下2025-04-04
以示例講解Clickhouse Docker集群部署以及配置
這篇文章主要介紹了Clickhouse Docker集群部署及配置,示例講解的非常詳細(xì),希望可以幫助到有需要的小伙伴2021-08-08

