Docker的持久化存儲和數據共享(四)

著做權歸做者全部,任何形式的轉載都請聯繫做者得到受權並註明出處。

有些容器會自動產生一些數據,爲了避免讓數據隨着container的消失而消失,保證數據的安全性。例如:數據庫容器,數據表的表會產生一些數據,若是我把container給刪除,數據就丟失。爲了保證數據不丟失,這就有了Volume的存在。html

Data Volume 結構圖 mysql

Docker持久化數據的方案

  • 基於本地文件系統的Volume。能夠再執行Docker create或Docker run時,經過-v參數將主機的目錄做爲容器的數據卷。這部分功能即是基本的本地文件系統的volume管理。
  • 基於plugin的Volume,支持第三方的存儲方案,好比NAS,aws

Volume的類型nginx

  • 受管理的data Volume,由docker後臺自動建立。
  • 綁定掛載的Volume,具體掛載位置能夠由用戶指定。

數據持久化之Data Volume

以官方鏡像mysql的dockerfile文件爲例。其中dockerfile經過volume指定了當前容器中要備份的文件路徑,可是並無指定說要保存到宿主機的哪一個位置。git

volume: 映射容器中的文件到本地宿主機硬盤中github

在咱們使用 docker run 啓動mysql鏡像容器的時候,容器會默認在宿主機生成一個volume,至於位置在哪,名字是什麼,能夠經過以下命令查看

#查看全部volume
docker volume ls
#刪除指定volume
docker volume rm [volume name]
#查看volume詳細
docker volume inspect [volume name]
複製代碼

此時咱們刪除容器,發現volume數據卷還在,有保留。

此時咱們會以爲這個data volume name 的名字很長,很很差理解。咱們能夠經過 -v以下命令來指定生成的volume name docker run -d -v mysql:/var/lib/mysql --name mysql mysql5.7
-v:前參數是volume name, :後面的是要備份的文件目錄(容器)
此時咱們刪除容器,volume數據卷還在,咱們用這個名爲mysql的volume做爲一個新容器的數據卷,覆蓋它。
docker run -d -v mysql:/var/lib/mysql --name mysql2 mysql5.7
進入mysql2容器中,mysql -uroot 進入數據庫中,發現當前數據庫數據和以前刪除的容器中的數據庫數據同樣。

數據持久化之bind Mounting

和上面Data Volume不一樣的是,bind Mounting只能經過docker run -v方式啓動,沒法使用dockerfile文件的方式。sql

運行容器的時候指定本地的一個文件目錄和容器中的一個文件目錄的映射,經過這個能夠作文件數據同步,2方不管哪一方有修改,另外一方都會同步內容docker

docker run -d -v $(pwd):/usr/share/nginx/html -p 80:80 --name nginx nginx
複製代碼

這個時候-v:前面的參數是本機文件路徑, :後面是docker文件目錄(容器)數據庫

值得注意的是,使用bind Mounting方式作數據卷的映射時,首次docker run -v 運行,若是本機的文件夾是沒有內容的,docker容器中的文件夾是有內容的,則本機的會覆蓋dokcer容器中的,也就是容器中本來有內容的也會沒有內容。安全

相關文章
相關標籤/搜索