部落客QQ:819594300
部落格位址:http://zpf666.blog.51cto.com/
有什麼疑問的朋友可以聯系部落客,部落客會幫你們解答,謝謝支援!
壹:Docker鏡像是由多個檔案系統(隻讀層)疊加而成。當我們啟動一個容器的時候,Docker會加載隻讀鏡像層并在其上(即鏡像棧頂部)添加一個讀寫層。如果運作中的容器修改了現有的一個已經存在的檔案,那該檔案将會從讀寫層下面的隻讀層複制到讀寫層,該檔案的隻讀版本仍然存在,隻是已經被讀寫層中該檔案的副本所隐藏。當删除Docker容器,并通過該鏡像重新啟動時,之前的更改将會丢失。在Docker中,隻讀層及在頂部的讀寫層的組合被稱為Union File System(聯合檔案系統)。
為了能夠儲存(持久化)資料以及共享容器間的資料,Docker提出了Volume的概念。簡單來說,Volume就是目錄或者檔案,它可以繞過預設的聯合檔案系統,而以正常的檔案或者目錄的形式存在于主控端上。
總結:Volume可以将容器以及容器産生的資料分離開來,這樣,當你使用docker rm my_container删除容器時,不會影響相關的資料。容器不能實作資料的持久存儲,一旦删除,則無法恢複。
我們可以通過兩種方式來初始化Volume,這兩種方式有些細小而又重要的差别。我們可以在運作時使用-v來聲明Volume。
docker管理資料的方式有兩種:
資料卷
資料卷容器
一個重點:如果不關閉主控端的selinux,将主控端的目錄挂載到容器中去,然後在容器中檢視挂載目錄下的内容就會提示ls:cannot opendirectory 挂載點(這個挂載點對應你設定的挂載點):Permission denied。是以要做本實驗之前最好關閉selinux,如果是永久關閉,去其配置檔案裡面改成disabled,并重新開機,其實也可以臨時關閉,指令是“setenforce 0”,再次想啟用selinux的話就把“0”改成“1”即可!
一、資料卷
概念:資料卷是為一個或多個容器專門指定繞過Union File System的目錄,為持續性或共享資料提供一些有用的功能。
資料卷特點:
資料卷可以在容器間共享和重用
資料卷資料改變是直接修改的
資料卷資料改變不會被包括在容器中
資料卷是持續性的,直到沒有容器使用它
資料卷的使用,類似于 Linux 下對目錄進行 mount,挂載一個主機目錄作為資料卷。
你想在容器中使用主機上的某個目錄,你可以通過-v參數來指定(注:注意冒号前面的和後面的内容):
格式:“docker run -v 主控端目錄:容器目錄(即挂載點) ...”
這明确地告訴Docker使用指定的主機路徑來代替Docker自己建立的根路徑并挂載到容器内指定的路徑。需要注意的是,如果主機上的路徑不存在,目錄将自動在給定的路徑中建立,同理,如果容器的目錄(即挂載點)也不存在的話,也會自動建立。
在用 docker run 指令的時候,可以指定挂載一個本地主機的目錄到容器中去,可以使用多次-v選項為一個 docker容器運作挂載多個本地主機目錄。-v選項除了可以挂載目前主機的一個目錄到容器中也可以添加一個或多個資料卷。
實驗:下面建立一個 web 容器,并加載一個主控端目錄到容器的 /var/www/html/目錄
1)在主控端上建立/web/webapp目錄,并建立一個index.html檔案

2)檢視鏡像
3)使用鏡像建立容器
4)挂載的目錄可以通過docker inspect 容器ID/容器名稱
5)在浏覽器中,輸入宿主IP和端口号,即可通路測試頁
總結:建立一個資料卷
Volume可以使用以下兩種方式建立:
1.在Dockerfile中指定“VOLUME 容器目錄”
2.執行“docker run -v 容器目錄”指令來指定
無論哪種方式都是做了同樣的事情。它們告訴Docker在主機上建立一個目錄(預設情況下是在/var/lib/docker/volumes下),然後将其挂載到指定的路徑。當删除使用該Volume的容器時,Volume本身不會受到影響,它可以一直存在下去。
額外知識點:
如果在容器中不存在指定的路徑,那麼該目錄将會被自動建立。建立資料卷綁定到到建立容器,建立容器中會建立 /data 資料卷。
建立一個對于挂載資料卷是ro權限的容器:
二、資料卷容器
如果要授權一個容器通路另一個容器的Volume,我們可使用--volumes-from參數來執行。
如果你有一些持久性的資料并且想在容器間共享,可以建立一個資料卷容器,然後從此容器上挂載資料。
還可以使用多個 --volumes-from 參數來從多個容器挂載多個資料卷。
實驗:建立資料卷容器以及讓新容器挂載資料卷容器
1)建立一個命名的資料卷容器
2)在其他容器中使用 --volumes-from 來挂載data容器的/test 卷
3)進入bdqn容器,執行df-hT檢視
4)也可以繼承其它挂載有 /test 卷的容器(bdqn2容器來挂載bdqn容器)
5)如果删除了挂載的容器(包括 data、bdqn 和 bdqn2),資料卷并不會被自動删除。如果要删除一個資料卷,必須在删除最後一個還挂載着它的容器時使用 docker rm -v 指令來指定同時删除關聯的容器。
6)說明一下,如果主控端的那個被資料卷容器挂載的目錄是人工自己手動建立的,則删除最後一個容器data的時候,自己建立的按個目錄是不會被自動删除的,會一直純在。直到你手動删除它為止。如過主控端的目錄是自動自己建立的/var/lib/docker/volumes目錄下的,則在删除最後一個容器時候會被自動自動删除。
貳:利用 Data Volume Container 來備份、恢複、移動資料
一、備份
資料卷另外一個功能是使用他們來備份、恢複、移動資料,如果你在用資料容器,那做備份是相當容易的。
1)建立一個資料卷容器,并且記得關閉selinux,并且重新開機系統
2)使用 –volume-from 标記來建立一個加載了卷的新的容器
二、恢複
1)先删除/web/webapp目錄,為恢複實驗做準備
2)再建立一個新容器用于恢複/web/webapp目錄下的資料
或者
3)檢查下是否恢複回來資料
附加知識點:
權限與許可
通常你需要設定Volume的權限或者為Volume初始化一些預設資料或者配置檔案。要注意的關鍵點是,在Dockerfile的VOLUME指令後的任何指令都不能改變該Volume,比如:
FROM debian:wheezy
RUN useradd foo
VOLUME /data
RUN touch /data/x
RUN chown -R foo:foo /data
該Docker file不能按預期那樣運作,我們本來希望touch指令在鏡像的檔案系統上運作,但是實際上它是在一個臨時容器的Volume上運作。如下所示:
RUN mkdir /data && touch /data/x
是以,牢記Dockerfile中VOLUME指令的位置(VOLUME是設定指令)
如果你沒有通過RUN指令設定權限,那麼你就需要在容器啟動時使用CMD或ENTRYPOINT指令來執行
删除 Volumes
Volume 隻有在下列情況下才能被删除:
docker rm -v删除容器時添加了-v選項
例如:你可以告訴Docker同時删除容器和其Volume:
docker rm -vmy_container
docker run --rm運作容器時添加了--rm選項