Data Volume 結構圖
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 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檔案的方式。
執行容器的時候指定本地的一個檔案目錄和容器中的一個檔案目錄的對映,通過這個可以做檔案資料同步,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容器中的,也就是容器中原本有內容的也會沒有內容。