Docker有兩種數據管理的方式docker
數據卷是一個可供容器使用的特殊==目錄==, 它將主機操做系統目錄直接映射進容器ubuntu
數據卷的特性:安全
$ docker volume create 數據卷名
可用的選項post
local
建立的數據卷在/var/lib/docker/volumes
路徑下操作系統
掛載數據卷通常是在docker run
命令中使用--mount
或者-v
選項code
最初,-v 或 --volume 標誌用於獨立容器,而 --mount 標誌用於羣集服務。可是,從 Docker 17.06 開始,也能夠在獨立容器上使用 --mount。通常來講,--mount 更明確和詳細。最大的不一樣在於 -v 語法將全部選項組合在一個字段中,而 --mount 語法將它們分開。建議使用 --mount語法。orm
$ docker run --mount,type=xxx,source=xxx,destination=xxx,readonly,bind-propagation=xxx
/var/lib/docker/volumes
路徑下建立一個新目錄,Docker會管理該目錄內容,將容器目錄下的數據同步到該目錄src
,匿名卷忽略這個參數;若是目錄不存在,會報錯
$ docker run -v source:destination:option
-v的語法比較簡單,經過兩個冒號分隔出三個位置內存
bind
綁定數據卷volume
普通數據卷關於數據卷,還有其餘命令同步
$ docker volume ls
須要注意,只會顯示volume
類型的數據卷string
$ 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
上
由於上一步是用絕對路徑壓縮的,而咱們當前容器目錄結構和備份時容器目錄結構是相同的,因此不用指定解壓目錄.