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

