docker容器的數據卷以及使用方式

            Docker容器的數據卷html

   想要了解Docker Volume,首先咱們須要知道Docker的文件系統是如何工做的。Docker鏡像是由多個文件系統(只讀層)疊加而成。當咱們啓動一個容器的時候,Docker會加載只讀鏡像層並在其上(鏡像棧頂部)添加一個讀寫層。若是運行中的容器修改了現有的一個已經存在的文件,那該文件將會從讀寫層下面的只讀層複製到讀寫層,該文件的只讀版本仍然存在,只是已經被讀寫層中該文件的副本所隱藏。當刪除Docker容器,並經過該鏡像從新啓動時,以前的更改將會丟失。Docker中,只讀層及在頂部的讀寫層的組合被稱爲Union File System(聯合文件系統)。web

爲了可以保存(持久化)數據以及共享容器間的數據,Docker提出了Volume的概念。簡單來講,Volume就是目錄或者文件,它能夠繞過默認的聯合文件系統,而以正常的文件或者目錄的形式存在於宿主機上。sql

總結:Volume能夠將容器以及容器產生的數據分離開來,這樣,當你使用docker  rm  my_container刪除容器時,不會影響相關的數據。docker

咱們能夠經過兩種方式來初始化Volume,這兩種方式有些細小而又重要的差異。咱們能夠在運行時使用-v來聲明Volume數據庫

docker管理數據的方式有兩種: 瀏覽器

· 數據卷app

· 數據卷容器webapp

數據卷是一個或多個容器專門指定繞過Union File System的目錄,爲持續性或共享數據提供一些有用的功能: ide

· 數據卷能夠在容器間共享和重用post

· 數據卷數據改變是直接修改的

· 數據卷數據改變不會被包括在容器中

· 數據卷是持續性的,直到沒有容器使用它

 

數據卷的使用,相似於 Linux 下對目錄進行 mount

掛載一個主機目錄做爲數據卷

你想在容器中使用主機上的某個目錄,你能夠經過-v參數來指定(注:注意冒號前面的和後面的內容):

docker run -v /host/path:/some/path ...

這明確地告訴Docker使用指定的主機路徑來代替Docker本身建立的根路徑並掛載到容器內指定的路徑(以上例子爲/some/path)。須要注意的是,若是主機上的路徑不存在,目錄將自動在給定的路徑中建立。

在用 docker run 命令的時候,能夠指定掛載一個本地主機的目錄到容器中去,可使用屢次-v選項爲一個 docker 容器運行掛載多個本地主機目錄。

 

下面建立一個 web 容器,並加載一個宿主機目錄到容器的 /var/www/html/目錄

在宿主機上建立/web/webapp1目錄,並建立一個index.html文件,內容以下:

wKiom1kgU_qwSyqmAAAle81b4FY182.png-wh_50 

查看鏡像:

 wKiom1kgVCXxEfEhAAAg3-vq9HQ208.png-wh_50

使用鏡像建立容器:

wKioL1kgVDihBG9wAABYvOhtDkM452.png-wh_50 

上面的命令加載主機的 /web/webapp1 目錄到容器的 /var/www/html 目錄。這個功能在進行測試的時候十分方便,

好比用戶能夠放置一些程序到本地目錄中,來查看容器是否正常工做。本地目錄的路徑必須是絕對路徑,若是目錄不存在 Docker 會自動爲你建立它。

/web/webapp1目錄的文件都將會出如今容器內。這對於在主機和容器之間共享文件是很是有幫助的,例如掛載須要編譯的源代碼。爲了保證可移植性(並非全部的系統的主機目錄都是能夠用的),掛載主機目錄不須要從Dockerfile指定。

掛載的目錄能夠經過docker inspect  容器ID

wKiom1kgVJHC2_nuAAAcrRR9hy4928.png-wh_50 

在瀏覽器中,輸入宿主IP和端口號,便可訪問測試頁

wKioL1kgVKjxQhI9AAAh9eOIS-k319.png-wh_50 

-v選項除了能夠掛載當前主機的一個目錄到容器中能夠添加一個或多個數據

建立一個數據卷

Volume可使用如下兩種方式建立:

1.Dockerfile中指定VOLUME  /some/dir

2.執行docker run -v /some/dir命令來指定

不管哪一種方式都是作了一樣的事情。它們告訴Docker在主機上建立一個目錄(默認狀況下是在/var/lib/docker/volumes下),而後將其掛載到指定的路徑(例子中是:/some/dir)。當刪除使用該Volume的容器時,Volume自己不會受到影響,它能夠一直存在下去。

若是在容器中不存在指定的路徑,那麼該目錄將會被自動建立。

建立數據卷綁定到到新建容器,新建容器中會建立 /data 數據卷

wKioL1kgVMHxRv3rAABIA2oYU9E160.png-wh_50 

注意:也能夠在 dockerfile 中使用 volume 來添加一個或者多個新的捲到由該 p_w_picpath 建立的任意容器,例如:

FROM debian:wheezy

VOLUME /data

進入容器,查看給容器添加的數據卷

wKioL1kgVNfjittwAAB7eal5OrA763.png-wh_50 

建立的數據卷能夠經過docker inspect獲取宿主機對應路徑

wKiom1kgVOyBO7BWAABFHRxZDUk769.png-wh_50 

這說明Docker把在/var/lib/docker下的某個目錄掛載到了容器內的/data目錄下。

注:docker版本及運行的宿主機系統不一樣,數據卷的查看和對應的具體路徑會有差別。

讓咱們從主機上添加文件到此文件夾下:

wKioL1kgVQHxPdLWAAAj0kA77p4664.png-wh_50 

進入咱們的容器內能夠看到:

docker  attach  容器名|容器ID

wKiom1kgVRKyEq6jAAATlqv4XzQ277.png-wh_50 

1Docker 掛載數據卷的默認權限是讀寫,用戶也能夠經過 :ro 指定爲只讀。

wKioL1kgVSay_1N3AAAkyg8_L6I716.png-wh_50 

加了  :ro  以後,就掛載爲只讀了。

 

數據卷容器

若是要受權一個容器訪問另外一個容器的Volume,咱們可使用--volumes-from參數來執行

若是你有一些持久性的數據而且想在容器間共享,能夠建立一個數據卷容器,而後今後容器上掛載數據。

常見的使用場景是使用純數據容器來持久化數據庫、配置文件或者數據文件等

例如:

docker run --name dbdata postgres echo "Data-only container for postgres"

該命令將會建立一個已經包含在Dockerfile裏定義過Volumepostgres鏡像(如:VOLUME  /var/lib/postgresql/data,運行echo命令而後退出。當咱們運行docker  ps命令時,echo能夠幫助咱們識別某鏡像的用途。咱們能夠用--volumes-from命令來識別其它容器的Volume

 docker run -d --volumes-from dbdata --name db1 postgres

 

如今就來建立一個命名的數據卷容器:

#docker run -dit -v /test --name data鏡像

wKioL1kgVUXzcyUiAAAa1ePzfI4335.png-wh_50 

使用--volumes-from選項在另外一個容器中掛載 /test 卷。無論 data 容器是否運行,其它容器均可以掛載該容器數據卷,固然若是隻是單獨的數據卷是不必運行容器的。

而後,你能夠在其餘容器中使用 --volumes-from  來掛載/test 卷

#docker run -dit --volumes-from data --name test1鏡像

wKiom1kgVV-AQXplAAAb3y8OKiY736.png-wh_50

添加另外一個容器

#docker run -dit --volumes-from data --name test2 鏡像

wKiom1kgVXKj-UNRAAAb2AYvVNY559.png-wh_50 

注:還可使用多個 --volumes-from  參數來從多個容器掛載多個數據卷

執行docker ps查看

wKioL1kgVYbjpPlIAABPTSc1LJQ436.png-wh_50 

進入test1test2容器,執行df查看

wKiom1kgVZmTK_rkAAEL0_wPaDQ561.png-wh_50 

也能夠繼承其它掛載有 /test 卷的容器

#docker run -dit --volumes-from test1 --name test3 鏡像

若是刪除了掛載的容器(包括 datadb1 db2),數據卷並不會被自動刪除。若是要刪除一個數據卷,必須在刪除最後一個還掛載着它的容器時使用  docker rm -v  命令來指定同時刪除關聯的容器。

利用 Data Volume Container  來備份、恢復、移動數據

備份

 

數據卷另一個功能是使用他們來備份、恢復、移動數據,若是你在用數據容器,那作備份是至關容易的

使用 --volume 標記來建立一個加載了卷的新的容器,命令以下:

該示例應該會將Volume裏全部的東西壓縮爲一個tar

wKioL1kgVbSg-BKbAAAxZkb6YhI736.png-wh_50 

這裏咱們建立了一個容器,先從 data 容器來掛載數據卷。而後從本地主機掛載當前目錄到容器的 /backup 目錄。最後,使用 tar 命令來將 data 卷備份爲 backup.tar 。當命令執行完、容器中止以後,咱們就備份了 data 數據卷

執行完成以後刪除容器--rm,此時備份就在當前的目錄下,名爲backup.tar

宿主機當前目錄下產生了 test 卷的備份文件 test.tar

wKioL1kgVciDAm0FAAA-pIPgUDY841.png-wh_50 

wKioL1kgVdrz-O_HAAAQxr1CjHQ723.png-wh_50 

恢復

wKioL1kgVfDQWeK7AAA9MrhUpLk953.png-wh_50 

wKiom1kgVgDTSrM7AAA7s_zxqn0985.png-wh_50 

附:

權限與許可

一般你須要設置Volume的權限或者爲Volume初始化一些默認數據或者配置文件。要注意的關鍵點是,在DockerfileVOLUME指令後的任何指令都不能改變該Volume,好比

FROM debian:wheezy

RUN useradd foo

VOLUME /data

RUN touch /data/x

RUN chown -R foo:foo /data

Docker file不能按預期那樣運行,咱們原本但願touch命令在鏡像的文件系統上運行,可是實際上它是在一個臨時容器的Volume上運行。以下所示:

FROM debian:wheezy

RUN useradd foo

RUN mkdir /data && touch /data/x

RUN chown -R foo:foo /data

VOLUME /data

因此,牢記DockerfileVOLUME指令的位置(VOLUME是設置指令)

若是你沒有經過RUN指令設置權限,那麼你就須要在容器啓動時使用CMDENTRYPOINT指令來執行

刪除 Volumes

Volume 只有在下列狀況下才能被刪除:

· docker rm -v刪除容器時添加了-v選項

例如:你能夠告訴Docker同時刪除容器和其Volume

      docker rm -v my_container

· docker run --rm運行容器時添加了--rm選項

即便用以上兩種命令,也只能刪除沒有容器鏈接的Volume。鏈接到用戶指定主機目錄的Volume永遠不會被docker刪除。

不然,會在/var/lib/docker/volumes目錄下獲得一些殭屍文件和目錄,而且還不容易說出它們到底表明什麼

相關文章
相關標籤/搜索