docker 數據持久化及配置Volume和mount說明


發現其他人構建容器docker run與自己寫法不一樣 

docker run --name=mysql5.7.21 \
-p 33061:3306 \
--privileged=true \
--mount type=bind,src=/data/mysql/conf/my.cnf,dst=/etc/my.cnf \
--mount type=bind,src=/data/mysql/data,dst=/var/lib/mysql \
--restart=always \
-e MYSQL_ROOT_PASSWORD=1234 \
-d mysql/mysql-server:5.7.21

好奇研究一下這個 --mount type  與-v

首先官方文檔說明

https://docs.docker.com/storage/

默認情況下,在容器內創建的所有文件都存儲在可寫容器層上。這意味着:

  • 當該容器不再存在時,數據不會持續存在,並且如果另一個進程需要數據,則可能很難將數據從容器中取出。
  • 容器的可寫層與運行容器的主機緊密耦合。您無法輕松地將數據移動到其他地方。
  • 寫入容器的可寫層需要 存儲驅動程序來管理文件系統。存儲驅動程序提供了一個聯合文件系統,使用 Linux 內核。與使用直接寫入主機文件系統的數據卷相比,這種額外的抽象會降低性能 。

Docker 有兩個選項讓容器在主機上存儲文件,以便即使在容器停止后文件也能持久保存:volumes和 bind mounts

Docker 還支持將文件存儲在主機內存中的容器。此類文件不會持久保存。如果您在 Linux 上運行 Docker,則使用tmpfs mount將文件存儲在主機的系統內存中。如果您在 Windows 上運行 Docker,命名管道用於將文件存儲在主機的系統內存中。

繼續閱讀有關持久化數據或利用內存文件的更多信息。

選擇正確的坐騎類型

無論您選擇使用哪種類型的掛載,容器內的數據看起來都是一樣的。它以目錄或容器文件系統中的單個文件的形式公開。

可視化卷、綁定掛載和tmpfs 掛載之間差異的一種簡單方法是考慮數據在 Docker 主機上的位置。

掛載類型以及它們在 Docker 主機上的位置

  • 卷存儲在由 Docker/var/lib/docker/volumes/在 Linux 上)管理的主機文件系統的一部分中。非 Docker 進程不應修改文件系統的這一部分。卷是在 Docker 中持久化數據的最佳方式。

  • 綁定掛載可以存儲在主機系統的任何位置。它們甚至可能是重要的系統文件或目錄。Docker 主機或 Docker 容器上的非 Docker 進程可以隨時修改它們。

  • tmpfs掛載僅存儲在主機系統的內存中,永遠不會寫入主機系統的文件系統。

......

看個開頭基本上已經差不多明白了 --mount type 就跟nfs/mount類似的功效;-V 相當於"給容器添加了一塊磁盤" 以供容器管理開銷  “非 Docker 進程不應修改文件系統的這一部分” 也很好的說明了某些在容器內的修改失效的情況

查了一下其他博主相關的解說

容器自身存儲的問題
Docker鏡像是由多個文件系統(只讀層)疊加而成,容器啟動的時候是在原鏡像層上面加了一層可讀寫層,容器層,如果運行中的容器修改了現有的一個已經存在的文件,那該文件將會從讀寫層下面的只讀層復制到讀寫層,該文件的只讀版本仍然存在,只是已經被讀寫層中該文件的副本所隱藏。當刪除Docker容器<不commit-Jaylon補充>,並通過該鏡像重新啟動時,之前的更改將會丟失。
————————————————
版權聲明:本文為CSDN博主「Y。S。H。」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/yangshihuz/article/details/103976407

不搬運了 就此結束


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM