Docker的持久化儲存和資料共享(四)

蔣老溼發表於2018-08-11

Docker的持久化儲存和資料共享(四)
有些容器會自動產生一些資料,為了不讓資料隨著container的消失而消失,保證資料的安全性。例如:資料庫容器,資料表的表會產生一些資料,如果我把container給刪除,資料就丟失。為了保證資料不丟失,這就有了Volume的存在。

Data Volume 結構圖

Docker的持久化儲存和資料共享(四)
Docker持久化資料的方案

  • 基於本地檔案系統的Volume。可以再執行Docker create或Docker run時,通過-v引數將主機的目錄作為容器的資料卷。這部分功能便是基本的本地檔案系統的volume管理。
  • 基於plugin的Volume,支援第三方的儲存方案,比如NAS,aws

Volume的型別

  • 受管理的data Volume,由docker後臺自動建立。
  • 繫結掛載的Volume,具體掛載位置可以由使用者指定。

資料持久化之Data Volume

以官方映象mysql的dockerfile檔案為例。其中dockerfile通過volume指定了當前容器中要備份的檔案路徑,但是並沒有指定說要儲存到宿主機的哪個位置。

volume: 對映容器中的檔案到本地宿主機硬碟中

Docker的持久化儲存和資料共享(四)
在我們使用docker run 啟動mysql映象容器的時候,容器會預設在宿主機生成一個volume,至於位置在哪,名字是什麼,可以通過如下命令檢視

#檢視所有volume
docker volume ls
#刪除指定volume
docker volume rm [volume name]
#檢視volume詳細
docker volume inspect [volume name]
複製程式碼

Docker的持久化儲存和資料共享(四)
此時我們刪除容器,發現volume資料卷還在,有保留。

Docker的持久化儲存和資料共享(四)
此時我們會覺得這個data volume name 的名字很長,很不好理解。我們可以通過-v如下命令來指定生成的volume name docker run -d -v mysql:/var/lib/mysql --name mysql mysql5.7
-v:前引數是volume name, :後面的是要備份的檔案目錄(容器)
Docker的持久化儲存和資料共享(四)
此時我們刪除容器,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檔案的方式。

執行容器的時候指定本地的一個檔案目錄和容器中的一個檔案目錄的對映,通過這個可以做檔案資料同步,2方無論哪一方有修改,另一方都會同步內容

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

這個時候-v:前面的引數是本機檔案路徑, :後面是docker檔案目錄(容器)

值得注意的是,使用bind Mounting方式做資料卷的對映時,首次docker run -v 執行,如果本機的資料夾是沒有內容的,docker容器中的資料夾是有內容的,則本機的會覆蓋dokcer容器中的,也就是容器中原本有內容的也會沒有內容。

相關文章