Docker的資料管理

來源:互聯網
上載者:User

標籤:系統   疊加   識別   許可權   總結   image   volume   否則   兩種   

Docker鏡像是由多個檔案系統(唯讀層)疊加而成。當我們啟動一個容器的時候,Docker會載入唯讀鏡像層並在其上(即鏡像棧頂部)添加一個讀寫層。如果運行中的容器修改了現有的一個已經存在的檔案,那該檔案將會從讀寫層下面的唯讀層複製到讀寫層,該檔案的唯讀版本仍然存在,只是已經被讀寫層中該檔案的副本所隱藏。當刪除Docker容器,並通過該鏡像重新啟動時,之前的更改將會丟失。
在Docker中,唯讀層及在頂部的讀寫層的組合被稱為Union File System(聯合檔案系統)。
為了能夠儲存(持久化)資料以及共用容器間的資料,Docker提出了Volume的概念。
簡單來說,Volume就是目錄或者檔案,它可以繞過預設的聯合檔案系統,而以正常的檔案或者目錄的形式存在於宿主機上。

> 總結:Volume可以將容器以及容器產生的資料分離開來,當你使用docker rm
my_container刪除容器時,不會影響相關的資料。
我們可以通過兩種方式來初始化Volume,這兩種方式有些細小而又重要的差別。我們
可以在運行時使用-v來聲明Volume:
docker管理資料的方式有兩種:
? 資料卷(Data Volumes)
? 資料卷容器(Data Volumes Containers)

資料卷:
資料卷是為一個或多個容器專門指定繞過Union File System的目錄,位於容器中,可將
宿主機的目錄掛載到資料卷上,對資料卷的修改操作立刻可見,並且更新資料不會影響鏡
像,從而實現資料在宿主機與容器之間的遷移,為持久性或共用資料提供一些有用的功能,
資料卷的使用,類似於Linux下對目錄進行的mount操作
? 資料卷可以在容器間共用和重用
? 資料卷資料改變是直接修改的
? 資料卷資料改變不會被包括在容器中
? 資料卷是持久性的,直到沒有容器使用它

1、建立資料卷
在docker run 命令中使用-v選項可以在容器中建立資料卷。多次使用-v選項可以建立多個
資料卷。例如:
[[email protected] ~]# docker run -itd -v /data1 -v /date2 --name web003 centos:httpv1
90030942574d6b47b6be2922a86b38f7483956f6231ab5e30fccc9d4431f61ec

進入容器web003,可以看到兩個資料卷已經建立成功並分別掛載到/data1與/date2上

可以使用docker inspect web003查看到掛載的資料卷
[[email protected] ~]# docker inspect web003

使用者也可以在Dockerfile中指定資料卷:
例如:

FROM debian:wheezy
VOLUME /data
注1:Docker 掛載資料卷的預設許可權是讀寫,使用者也可以通過 :ro 指定為唯讀。
例如:

2、掛載主機目錄作為資料卷
如果想在容器中使用主機上的某個目錄,你可以通過-v參數來指定(註:注意冒號前面的
和後面的內容):
docker run -v /host/path:/some/path ...
這明確地告訴Docker使用指定的主機路徑來代替Docker自己建立的根路徑並掛載到容器內
指定的路徑(以上例子為/some/path)。需要注意的是,宿主機本地目錄上的路徑必須使
用絕對路徑,如果主機上的路徑不存在,目錄將自動在給定的路徑中建立。
在用 docker run 命令的時候,可以指定掛載一個本地主機的目錄到容器中去,可以使用多
次-v選項為一個 docker 容器運行掛載多個本地主機目錄。
執行個體:1、在宿主機上建立/web/webapp1目錄,並建立一個index.html檔案,內容如下:
[[email protected] ~]# mkdir /web/webapp1 -p
[[email protected] ~]# cd /web/webapp1/
[[email protected] webapp1]# echo "<h1> hello world</h1>" >> index.html
[[email protected] webapp1]# cat index.html
<h1> hello world</h1>
[[email protected] webapp1]#
2、使用帶有apache服務的一個鏡像,產生容器
[[email protected] ~]# docker run -itd -v /web/webapp1/:/var/www/html/ -p 8000:80 --name web005
centos:httpv1


3、訪問容器的網站服務:

上面的命令載入主機的 /web/webapp1 目錄到容器的 /var/www/html 目錄。這個功
能在進行測試的時候十分方便,比如使用者可以放置一些程式到本地目錄中,來查看容器是否
正常工作。本地目錄的路徑必須是絕對路徑,如果目錄不存在 Docker 會自動為你建立
它。/web/webapp1目錄的檔案都將會出現在容器內。這對於在主機和容器之間共用檔案
是非常有協助的,例如掛載需要編譯的原始碼。為了保證可移植性(並不是所有的系統的主
機目錄都是可以用的),掛載主機目錄不需要從Dockerfile指定。

資料卷容器:
如果需要在容器之間共用一些資料,最簡單的方法就是使用資料卷容器。資料卷容器
就是一個普通的容器,專門提供資料卷給其它容器掛載使用。
使用方法如下:首先,需要建立一個容器作為資料卷容器,之後在其它容器建立時用-
-volumes-from掛載資料卷容器中的資料卷使用。
常見的使用情境是使用純資料卷容器來持久化資料庫、設定檔或者資料檔案等。
例如:docker run --name dbdata postgres echo "Data-only container for postgres"
該命令將會使用一個已經包含在Dockerfile裡定義過Volume的postgres鏡像來產生一個容
器dbdata(如:VOLUME /var/lib/postgresql/data),運行echo命令然後退出。當我
們運行docker ps命令時,echo可以協助我們識別某鏡像的用途。我們可以用--volumesfrom命令來識別其它容器的Volume:
docker run -d --volumes-from dbdata --name db1 postgres

執行個體:
現在就來建立一個命名的資料卷容器:
#docker run -dit -v /test --name data 鏡像

使用--volumes-from選項在另一個容器中掛載/test卷。不管data容器是否運行,其它容器
都可以掛載該容器資料卷,當然如果只是單獨的資料卷是沒必要運行容器的。
然後,你可以在其他容器中使用 --volumes-from 來掛載/test卷

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

再添加一個容器:

註:還可以使用多個 --volumes-from 參數來從多個容器掛載多個資料卷
執行docker ps查看

進入test1、test2容器,執行df查看

也可以繼承其它掛載有 /test 卷的容器
#docker run -dit --volumes-from test1 --name test3 鏡像
如果刪除了掛載的容器(包括 data、db1 和 db2),資料卷並不會被自動刪除。如果要刪
除一個資料卷,必須在刪除最後一個還掛載著它的容器時使用 docker rm -v 命令來指定
同時刪除關聯的容器。利用 Data Volume Container來備份、恢複、移動資料

備份
資料卷另外一個功能是使用他們來備份、恢複、移動資料,如果你在用資料容器,那做備
份是相當容易的。使用 --volume 標記來建立一個載入了卷的新的容器,命令如下:
該樣本應該會將Volume裡所有的東西壓縮為一個tar包
[[email protected] ~]# docker run --rm --volumes-from data -v $(pwd):/backup centos:httpv1 tar cvf /backup/backup.tar /test

這裡我們建立了一個容器,先從data容器來掛載資料卷。然後從本地主機掛載目前的目錄到
容器的 /backup 目錄。最後,使用tar命令來將data 卷備份為backup.tar 。當命令執行
完、容器停止之後,我們就備份了 data 資料卷
執行完成之後刪除容器 --rm,此時備份就在當前的目錄下,名為backup.tar
宿主機目前的目錄下產生了test卷的備份檔案test.tar


恢複
docker run --volumes-from data -v /root/:/backup centos:httpv1 tar zxf /backup/backup.tar -C /test/

附:
許可權與許可
通常你需要設定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上運行。如下所示:
FROM debian:wheezy
RUN useradd foo
RUN mkdir /data && touch /data/x
RUN chown -R foo:foo /data
VOLUME /data
所以,牢記Dockerfile中VOLUME指令的位置(VOLUME是設定指令)
如果你沒有通過RUN指令設定許可權,那麼你就需要在容器啟動時使用CMD或ENTRYPOINT
指令來執行
刪除 Volumes
Volume 只有在下列情況下才能被刪除:
? docker rm -v刪除容器時添加了-v選項
例如:你可以告訴Docker同時刪除容器和其Volume:
docker rm -v my_container
? docker run --rm運行容器時添加了--rm選項
即使用以上兩種命令,也只能刪除沒有容器串連的Volume。串連到使用者指定主機目錄
的Volume永遠不會被docker刪除。否則,會在/var/lib/docker/volumes目錄下得到一些
殭屍檔案和目錄,並且還不容易說出它們到底代表什麼。

Docker的資料管理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.