Docker數據管理

Docker有兩種數據管理的方式docker

  • 數據卷: 容器內數據直接映射到本地主機環境;
  • 數據卷容器: 使用特定容器維護數據卷.

數據卷

數據卷是一個可供容器使用的特殊==目錄==, 它將主機操做系統目錄直接映射進容器ubuntu

數據卷的特性:安全

  1. 能夠在容器之間共享和重用, 容器間傳遞數據將變得高效與方便;
  2. 對數據卷內數據的修改會當即生效,不管是容器內操做仍是本地操做;
  3. 對數據卷的更新不會影響鏡像,解耦開應用和容器;
  4. 卷會一直存在,直到沒有容器使用,能夠安全地卸載它

建立數據卷

$ docker volume create 數據卷名

可用的選項post

  • -d --driver string 指定卷驅動程序名,默認爲local
  • --label 爲卷設置元數據
  • -o --opt map 設置驅動程序特定選項

建立的數據卷在/var/lib/docker/volumes路徑下操作系統

掛載數據卷

掛載數據卷通常是在docker run命令中使用--mount或者-v選項code

最初,-v 或 --volume 標誌用於獨立容器,而 --mount 標誌用於羣集服務。可是,從 Docker 17.06 開始,也能夠在獨立容器上使用 --mount。通常來講,--mount 更明確和詳細。最大的不一樣在於 -v 語法將全部選項組合在一個字段中,而 --mount 語法將它們分開。建議使用 --mount語法。orm

使用--mount(推薦)

$ docker run --mount,type=xxx,source=xxx,destination=xxx,readonly,bind-propagation=xxx
  • type爲數據卷類型,有三種類型的數據卷
    • volume 普通數據卷,在主機/var/lib/docker/volumes路徑下建立一個新目錄,Docker會管理該目錄內容,將容器目錄下的數據同步到該目錄
    • bind 綁定數據卷,主機上的文件或目錄被掛載到容器中,覆蓋容器相關目錄內容;依賴宿主機特定的目錄結構,DockerFile不能使用這種方式
    • tmpfs 臨時數據卷,只存在於內存中
  • source 宿主機位置 也能夠替換爲 src,匿名卷忽略這個參數;若是目錄不存在,會報錯
    • type是volume時填寫已建立好數據卷的名字
    • type是bind時填寫綁定文件夾的絕對路徑
  • destination 容器內位置 必須是容器內絕對路徑
  • readonly爲只讀,容器只有數據卷掛載目錄的只讀權限
  • bind-propagation子屬性
    • shared 原始mount的次級mount會顯示在重複mount中, 且重複mount的次級mount的內容也會在原始mount中顯示
    • slave 與shared mount類似,只是內容單方向可見,重複mount的內容不會在原始mount中顯示。
    • private 次級mount在原始mount和重複mount之間互不可見
    • rshared 與shared mount同樣,只是傳播範圍擴展至嵌套的重複mount和原始mount
    • rslave 與slave mount同樣,只是傳播範圍擴展至嵌套的重複mount和原始mount
    • rprivate 默認值,與private mount同樣,即原始mount和重複mount之間都不會傳播內容。

使用-v

$ docker run -v source:destination:option

-v的語法比較簡單,經過兩個冒號分隔出三個位置內存

  • 第一個位置是宿主機位置,若是目錄不存在,會建立數據卷或者目錄
    • 若是填寫絕對路徑,數據卷類型爲bind綁定數據卷
    • 若是填寫相對路徑,數據卷類型爲volume普通數據卷
  • 第二個位置是容器內位置,必須是絕對路徑
  • 第三個位置是可選的,是一個使用逗號分隔的選項列表
    • ro 只讀
    • delegated
    • cached
    • z
    • Z

關於數據卷,還有其餘命令同步

查看數據卷

$ docker volume ls

須要注意,只會顯示volume類型的數據卷string

  • -f, --filter 指定過濾規則
    • 'dangling=true' 未經任何容器使用的卷
    • 'driver=xxx' 過濾捲上的驅動程序名
  • --format 使用模板規則打印
  • -q 只顯示卷名

查看數據卷詳細信息

$ docker volume inspect 數據卷名

刪除數據卷

$ docker volume rm 數據卷名

# 清理無用數據卷
$ docker volume prune

數據卷容器

數據卷容器是一個用於多個容器之間共享更新數據的==容器==

建立數據卷容器

首先,建立一個數據卷容器dbdata,並在其中建立一個數據卷掛載到/dbdata

$ docker run -it -v /dbdata --name dbdata ubuntu

這個例子中使用的是匿名數據卷,將一個隨機名字的數據卷掛載到容器的/dbdata目錄

經常使用的鏡像均可以生成數據卷容器

能夠在其餘容器中使用--volumes-from來掛載dbdata容器中的數據卷

$ docker run -it --volumes-from dbdata -name dbl ubuntu 
$ docker run -it --volumes-from dbdata -name db2 ubuntu

這三個容器任意一方在該目錄寫入,其它容器均可以看到

能夠屢次使用--volumes-from 參數來從多個容器掛載多個數據卷,還能夠從其餘已 經掛載了容器卷的容器來掛載數據卷:

$ docker run -d --name db3 --volumes-from dbl training/postgres

簡單來講,就是獲取其餘容器上掛載的數據卷,同時掛載在本身這個容器上

利用數據卷容器來遷移數據

備份

$ docker run --name worker --volumes-from dbdata -v /dataDir:/backer busybox tar -cvf /backer/backup.tar /dbdata

這句命令的意思是,建立一個鏡像,獲取dbdata的數據卷,掛載到當前容器同名目錄(dbdata掛載在/dbdata,因此咱們的容器中也掛載在/dbdata),而後新建一個bind類型數據卷,掛載宿主機/dataDir到容器內部的/backer

啓動容器後執行命令tar -cvf /backer/backup.tar /dbdata 將dbdata的數據卷內數據打包,放在新建數據卷內

這樣,咱們宿主機的/dataDir就能夠獲取dbdata數據卷內的打包數據backup.tar

使用busybox的緣由是,這個容器的使命就是運行打包這條命令,運行以後容器就執行完畢,因此不必使用擁有完善功能的鏡像,busybox就幾個MB卻包含了常常使用的命令,很是適合這種場景

恢復

首先咱們再建立一個和dbdata1相同的數據卷容器,命名爲dbdata2

$ docker run -it -v /dbdata --name dbdata2 ubuntu

下面咱們將上一步備份的數據,恢復到數據卷容器中

$ docker run --name worker2 --volumes-from dbdata2 -v /dataDir:/backer busybox tar -xvf /backer/backup.tar

和備份的思路相同,獲取dbdata2的數據卷,掛載在容器/dbdata;而後主機含有tar文件的dataDir掛載到容器/backer

由於上一步是用絕對路徑壓縮的,而咱們當前容器目錄結構和備份時容器目錄結構是相同的,因此不用指定解壓目錄.

相關文章
相關標籤/搜索