Docker數(shù)據(jù)持久化之如何讓新容器同步舊數(shù)據(jù)詳解
適合人群:剛接觸 Docker 的 Java / 后端開發(fā)者
目標:徹底理解 -v 數(shù)據(jù)卷的作用、數(shù)據(jù)保存機制,以及容器刪除后數(shù)據(jù)為什么不丟
一、Docker 的容器與數(shù)據(jù)之間的關系
我們先來理解一個關鍵概念:
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ù)還能“復活”!
現(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與宿主機的文件夾建立了“實時映射關系”;- 容器只是“使用”那里的數(shù)據(jù)文件,并不會直接擁有;
- 刪除容器只會刪除容器本身的鏡像層,不會影響宿主機的文件。
換句話說:
數(shù)據(jù)卷是“獨立存在的外部存儲”,容器只是臨時使用它。
六、同樣適用于 Redis、Elasticsearch 等服務
| 服務 | 掛載命令 | 容器內(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 存儲上 |
| 容器遷移 | 拷貝宿主機對應路徑即可恢復數(shù)據(jù) |
十、總結(jié)一句話
沒有 -v,容器刪了數(shù)據(jù)也沒了;
有了 -v,數(shù)據(jù)存在宿主機目錄中,刪容器也不影響。
只要新容器掛載相同目錄,數(shù)據(jù)就能“原地復活”。
延伸閱讀
Docker 官方文檔:https://docs.docker.com/storage/volumes/
推薦命令:
docker volume ls # 查看所有數(shù)據(jù)卷 docker volume inspect 卷名 docker system df # 查看磁盤空間占用
到此這篇關于Docker數(shù)據(jù)持久化之如何讓新容器同步舊數(shù)據(jù)詳解的文章就介紹到這了,更多相關Docker新容器同步舊數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
在wsl-ubuntu中如何通過 docker 啟動 gpu-jupyter
這篇文章主要介紹了在wsl-ubuntu中如何通過 docker 啟動 gpu-jupyter,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-01-01
詳解docker中Dockerfile指令創(chuàng)建鏡像
這篇文章主要介紹了詳解docker中Dockerfile指令創(chuàng)建鏡像,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11
Docker方式啟動tomcat訪問首頁出現(xiàn)404錯誤
這篇文章主要介紹了Docker方式啟動tomcat訪問首頁出現(xiàn)404錯誤。文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-12-12
docker安裝,yum安裝失敗解決方案,阿里云鏡像安裝過程
在配置Yum源遇到問題時,嘗試使用阿里云鏡像可以有效解決,本文詳細介紹了如何配置阿里云源及安裝Docker的步驟,首先,若Yum源配置出錯,建議更換為阿里云鏡像;其次,詳述了安裝Docker的具體命令,包括啟用阿里云源和安裝過程中的選擇提示2024-11-11
docker swarm如何在指定的node上運行指定的容器
這篇文章主要介紹了docker swarm如何在指定的node上運行指定的容器,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-07-07

