Docker數據管理-數據卷 data volumes和數據卷容器data volumes containers的使用詳解

此文來源於:https://yq.aliyun.com/ziliao/43471css

參考原文件以外,作了些修改。linux

Volume數據卷是Docker的一個重要概念。數據卷是可供一個或多個容器使用的特殊目錄,能夠爲容器應用存儲提供有價值的特性:web

  • 持久化數據與容器的生命週期解耦:在容器刪除以後數據卷中的內容能夠保持。Docker 1.9以後引進的named volume(命名文件卷)能夠更加方便地管理數據卷的生命週期;數據卷能夠被獨立地建立和刪除。
  • 數據卷能夠用於實現容器之間的數據共享
  • 能夠支持不一樣類型的數據存儲實現

 

 數據的管理目前提供以下兩種方式:docker

  • 數據卷 data volumes
  • 數據卷容器 data volumes containers

 

Docker缺省提供了對宿主機本地文件卷的支持,能夠將宿主機的目錄掛載到容器之中。因爲沒有容器分層文件系統帶來的性能損失,**本地文件卷很是適合一些須要高性能數據訪問的場景**,好比MySQL的數據庫文件的存儲。同時Docker支持經過volume plugin實現不一樣類型的數據卷,能夠更加靈活解決不一樣應用負載的存儲需求。好比在阿里雲容器服務中能夠爲容器提供基於雲盤的塊存儲、基於OSSFS和NAS/NFS的共享文件存儲。數據庫

 

注意: 數據卷常常出的問題在於權限問題,ossfs只能有一個用戶可寫,加上allow_other後可多個用戶讀,但依然是隻有一個用戶可寫。並且ossfs併發爲10,若是大量併發的場合顯然不合適。 

 

 一,數據卷
數據卷,說白了就是一個特殊目錄,相似linux下對目錄或文件進行mount掛載操做,只不過他繞過了文件系統。具備以下特色:
(1) 數據卷能夠在容器之間進行共享和重用
(2)對數據卷的更改會當即生效
(3)對數據卷的更新不會影響到鏡像  (鏡像只讀)
(4)卷會一直存在,知道沒有容器使用centos

數據卷的添加能夠經過-v 參數來設定,後邊跟上目錄。一下舉例說明:
1,建立一個數據卷/homedata到容器os123中:bash

[root@docker5 home]# docker  run  -d -ti --name os123   -v  /homedata  centos
[root@docker5 home]# docker  exex  -ti os123 /bin/bash
[root@d1a05a7d5efe /]# ll
total 40
-rw-r--r--. 1 root root 18301 Jun 2 13:27 anaconda-post.log
lrwxrwxrwx. 1 root root 7 Jun 2 13:25 bin > usr/bin
drwxr-xr-x. 5 root root 380 Jun 23 02:42 dev
drwxr-xr-x. 48 root root 4096 Jun 23 02:42 etc
drwxr-xr-x. 2 root root 6 Aug 12 2015 home
drwxr-xr-x. 2 root root 6 Jun 23 02:42 homedata
..
[root@d1a05a7d5efe /]# cd homedata/
[root@d1a05a7d5efe homedata]# ll
total 0
[root@d1a05a7d5efe homedata]# touch  21yunwei.txt ;echo 123>> 21yunwei.txt
[root@d1a05a7d5efe homedata]# cat  21yunwei.txt 
123
2,掛載本地服務器上的一個目錄/home/data到容器os456 目錄/homedata中:
home/data事先裏邊創建一個文件1.txt並內容hello world服務器

[root@docker5 home]# docker run  -d -ti --name os456 -v /home/data:/homedata centos
9347d5ef84ffc532000df2637ff3280da001573029e826427d3b71cc88aa4703
[root@docker5 home]# docker exec  -ti os456  /bin/bash
[root@9347d5ef84ff homedata]# cd /homedata;cat  1.txt 
hello world
經過上邊兩個容器os123 和os456,基本瞭解瞭如何建立數據卷以及如何掛載本地目錄到數據卷中。注意,兩個容器中的若是是單獨掛載的數據卷(即沒有掛載同一個數據卷容器),那麼數據是互不影響的,進入不一樣的數據卷相同目錄下好比/homedata,內容能夠不同。併發

注意:刪除容器的時候,數據卷不會刪除。若是要刪除容器的時候同時刪除數據卷,需加上-v參數。好比: docker   rm  os456  -v   /homedatajsp

 

二,數據卷容器
創建的容器不少時候不是單一的,須要容器之間進行數據共享,進行數據同步和更新操做。這樣就須要創建一個數據卷容器。
數據卷容器就是一個普通的容器,裏邊帶有設置好的數據卷,專門提供給其餘容器掛載使用。 經過–volumes-from 數據卷容器名 來實現。
我有一個網站程序放到了服務器本機的/home/webdata目錄 ,下邊建立一個數據卷容器webdata,同時將我服務器上的/home/webdata掛載到數據卷容器的/web目錄:

[root@docker5 home]# docker  run  -d  -ti  --name webdata   -v  /home/webdata:/home/web  centos
進入容器並查看數據

[root@docker5 home]# docker exec  -ti  webdata  /bin/bash
[root@289598d6e24d /]# cd  /home/web/
[root@289598d6e24d web]# ll
total 7872
drwxr-xr-x. 3 root root      54 Mar 27  2013 META-INF
drwxr-xr-x. 6 root root    4096 Dec 25  2014 WEB-INF
drwxr-xr-x. 3 root root      63 Mar 27  2013 css
drwxr-xr-x. 2 root root    8192 Mar 27  2013 flags
-rw-r--r--. 1 root root      97 Mar 27  2013 index.jsp
drwxr-xr-x. 2 root root    4096 Mar 27  2013 js
drwxr-xr-x. 2 root root       6 Jun 23 03:43 probe
經過這裏創建1.txt 並插入內容,能夠看到服務器上的/home/webdata數據是同步的。可見容器以及目錄掛載都沒問題。

[root@docker5 home]# docker  run  -dti --volumes-from webdata --name os147 centos
[root@docker5 home]# docker  run  -dti --volumes-from webdata --name os258 centos
分別建立了兩個容器,都經過–volumes-from webdata 掛載了同一個數據卷容器,進入os147 和os258 分別查看/home/web可見數據都是存在的,因而這裏就實現了數據的共享同步。

[root@docker5 home]# docker exec  -ti  os147  /bin/bash
[root@b4cfa4c4e11c /]# cd  /home/web/
[root@b4cfa4c4e11c web]# ll
total 7876
-rw-r--r--. 1 root root      11 Jun 23 03:46 1.txt
drwxr-xr-x. 3 root root      54 Mar 27  2013 META-INF
drwxr-xr-x. 6 root root    4096 Dec 25  2014 WEB-INF
drwxr-xr-x. 3 root root      63 Mar 27  2013 css
drwxr-xr-x. 2 root root    8192 Mar 27  2013 flags
-rw-r--r--. 1 root root      97 Mar 27  2013 index.jsp
drwxr-xr-x. 2 root root    4096 Mar 27  2013 js
drwxr-xr-x. 2 root root       6 Jun 23 03:43 probe
說明:
1,能夠屢次使用–volume-from參數從多個容器掛載多個目錄。  也能夠從其餘已經掛載了數據卷的容器來掛載數據卷(相似傳遞)。
2,再次強調:若是刪除了掛載的容器,數據卷不會被自動刪除。若是要刪除容器的時候同時刪除數據卷,需加上-v參數。

 

三,經過數據卷容器進行數據備份、數據恢復和數據遷移
1,備份:咱們建立一個專門用來備份probe的容器:probebak進行備份數據卷容器中的數據,命令以下

docker run  -dti --volumes-from webdata  --name probebak -v /home/web_probebak:/backup   centos tar zcvf /backup/web_probe.tar.gz  /home/web
命令爲建立一個專用備份的容器probebak,掛載了數據卷容器webdata,同時將服務器本地目錄 /home/web_probebak掛載到了備份容器上的/backup目錄容器啓動之後,會執行tar zcvf /backup/web_proce.tar.gz /home/web操做,完成服務器上/home/web備份,打包到/backup/web_proce.tar.gz,也就是打包到了/home/web_probebak/web_probe.tar.gz 實現了數據備份。

2,恢復
建立一個容器os999  ,掛載有數據卷 /testdata

[root@docker5 home]# docker run  -v  /testdata --name os999  centos  /bin/bash
再建一個容器,經過–volumes-from os999掛載剛纔設置好的數據卷,解壓數據:

[root@docker5 home]# docker run --volumes-from os999 -v /home/web_probebak:/backup busybox tar zxvf /backup/web_probe.tar.gzUsage of loopback devices is strongly discouraged for production use. Either use `--storage-opt dm.thinpooldev` or use `--storage-opt dm.no_warn_on_loop_devices=true` to suppress this warning.home/web/home/web/probe.ziphome/web/probe/home/web/css/home/web/css/classic/home/web/css/classic/datasourcetest.css.

相關文章
相關標籤/搜索