在實際使用docker過程當中,有時須要查看容器內應用產生的數據,或須要把容器內的數據進行備份,甚至是多個容器間須要共享數據,這勢必涉及到數據管理,那麼docker的數據怎麼管理呢?node
容器中數據管理主要有如下兩種方式:1.數據卷(data volumes) ;2.數據卷容器(data volumes containers);web
數據卷是一個可提供容器使用的特殊目錄,它繞過文件系統(UFS),能夠提供不少有用的特性:docker
1.數據卷能夠在容器間共享和重用; 2.對數據卷的修改會立馬生效; 3.對數據卷的更新不會影響到鏡像; 4.數據卷一直存在,直到容器沒有使用; 5.徹底獨立於容器的生存週期,所以不會在刪除容器時刪除其掛在的數據卷。
提示:docker數據卷的使用,相似Linux系統下對目錄或文件進行mount操做。shell
1.1 如何在容器內建立數據卷
在使用docker run命令建立並啓動容器時。經過-v選項能夠在容器內建立一個數據卷,若是想要建立多個數據卷只須要屢次使用-v便可。
例以下面使用centos:latest鏡像建立一個名爲web容器,並建立一個數據卷掛載到容器的/data 目錄下centos
[root@srv-xjwy-dns-node01 ~]# docker run -itd --name web -v /data centos:latest 4fa33359e280ee16fd375c7165858bfea81dd0971659c3585699636101224bc0 [root@srv-xjwy-dns-node01 ~]# docker exec -it 4fa33359e280 ls -dl /data drwxr-xr-x 2 root root 6 Dec 12 15:01 /data
1.2 如何掛載宿主主機目錄做爲容器的數據卷
一樣也能夠經過-v選項掛載容器宿主主機目錄做爲容器的數據卷,格式:docker run -v 容器宿主主機目錄路徑:容器內數據卷路徑,若是容器內沒有該數據卷,則會自動建立該數據卷,注意中間用「:」隔開,以下所示,將本地的/data/目錄掛在到容器做爲數據卷:bash
[root@srv-xjwy-dns-node01 www]# ls /data/www/ test.txt [root@srv-xjwy-dns-node01 www]# docker run -itd --name test -v /data/www:/data centos:latest bf4aaf1b6a050ee1eb60b889d3e68c04a0f30a5423aade99a4b228918170d63b [root@srv-xjwy-dns-node01 www]# docker exec -it test ls /data/ test.txt
發現成功的將容器宿主主機的/data/www目錄掛在到名爲test容器裏做爲數據卷,路徑爲:/data,而且test.txt文件也在該容器/data/目錄下;app
注:/data/www爲宿主機目錄,/data是容器中目錄,若/data目錄不存在容器會自動建立,另外宿主主機的目錄路徑必須是絕對路徑;分佈式
默認容器對掛在的數據卷權限爲可讀可寫(rw),也能夠經過ro指定數據卷爲可讀權限,以下所示:ide
[root@srv-xjwy-dns-node01 www]# docker run -itd --name prod -v /data/www:/data:ro centos:latest [root@srv-xjwy-dns-node01 www]# docker exec -it prod touch /data/1.txt touch: cannot touch '/data/1.txt': Read-only file system
這樣在容器內就不能修改數據卷內容,只能在宿主主機上修改,這時在宿主主機對應的目錄下建立一個文件,發現容器實時同步過來了:工具
root@srv-xjwy-dns-node01 www]# touch prod.txt [root@srv-xjwy-dns-node01 www]# docker exec -it prod ls -l /data/ total 0 -rw-r--r-- 1 root root 0 Dec 12 15:42 prod.txt -rw-r--r-- 1 root root 0 Dec 12 15:13 test.txt
說明當設置容器的數據卷權限爲可讀(ro)時,只能在容器的宿主主機相對應的目錄進行文件目錄的增刪改查操做,而不能在容器數據卷內操做,用docker inspect prod查看,仔細觀察發現, 結果以下:
[root@srv-xjwy-dns-node01 www]# docker inspect prod "Mounts": [ { "Type": "bind", "Source": "/data/www", "Destination": "/data", "Mode": "ro", "RW": false, "Propagation": "rprivate" }
發現此時容器數據卷是可讀模式,即不能在容器內修改該數據卷裏的內容
1.3 如何掛載宿主主機文件做爲容器的數據卷
-v也能夠將容器宿主主機本地單個文件掛載到容器做爲數據卷使用,以下:
docker run -rm -it --name prod -v /data/www/test.txt:/data/test.txt centos:latest /bin/bash
注意:若是掛載一個文件到容器,使用編輯工具時,可能會形成文件inode改變,致使容器報錯,因此最佳推介方式是掛在文件所在的目錄。
舒適提示:
Clean up (--rm) 默認狀況下,每一個容器在退出時,它的文件系統也會保存下來,這樣一方面調試會方便些,由於你能夠經過查看日誌等方式來肯定最終狀態。另一方面,你也能夠保存容器所產生的數據。可是當你僅僅須要短暫的運行一個容器,而且這些數據不須要保存,你可能就但願Docker能在容器結束時自動清理其所產生的數據。這個時候你就須要--rm這個參數了。 注意:--rm 和 -d不能共用!
在有些狀況下容器之間須要共享一些持續更新的數據,這時最簡單的方式就是利用數據卷容器來實現,數據卷容器就是一個普通的容器,只不過用它提供的數據卷供其餘容器掛載而已。
以下,建立一個數據卷容器data,並在其中建立一個數據卷/datas:
root@srv-xjwy-dns-node01 ~]# docker run -it --name data -v /datas centos:latest [root@a92af8ad138f /]# ll /data/ total 0
而後使用--volumes-from選項掛載data容器中/datas數據卷,例以下面建立兩個容器:app1,app2,並從datas容器掛載數據卷:
[root@srv-xjwy-dns-node01 ~]# docker run -it --volumes-from data --name app1 centos:latest [root@srv-xjwy-dns-node01 ~]# docker run -it --volumes-from data --name app2 centos:latest [root@srv-xjwy-dns-node01 ~]# docker exec app1 ls /datas/ test.txt text2.txt [root@srv-xjwy-dns-node01 ~]# docker exec app2 ls /datas/ test.txt text2.txt
分別進入app一、app2容器中,會有一個/datas目錄,在app1裏的/datas目錄建立文件,app2也能看的到,另外使用--volumes-from時,後面的值是數據卷容器的名稱而不是數據卷容器中數據卷。
注意:
1.若是刪除data、app一、app2,時,數據卷並不會被自動刪除。若是想刪除,必須刪除最後一個掛載着它的容器,使用docker rm -v 命令來指定刪除關聯的容器;
2.使用--volumes-from參數掛載的數據卷容器自身並不須要保持在運行狀態。
3.使用數據卷容器會下降I/O讀寫性能;
4.能夠屢次使用--volumes-from參數掛載多個容器中的數據卷,也能夠從已經掛載了容器卷的容器掛載數據卷;
在實際應用中,能夠利用數據卷容器對其中的數據卷作數據備份。數據恢復以實現數據遷移;
3.1 數據卷數據備份
以下將data數據卷容器中/datas數據捲進行數據備份:
[root@srv-xjwy-dns-node01 ~]# docker run -it --volumes-from data -v /data/apps/bak:/backup --name backup centos:latest tar cvf /backup/backup.tar /datas tar: Removing leading `/' from member names /datas/ /datas/test.txt [root@srv-xjwy-dns-node01 ~]# cd /data/apps/bak/ [root@srv-xjwy-dns-node01 bak]# ls backup.tar
上面先是建立了一個backup容器,並使用--volumes-form將容器data下的datas數據卷掛載到本身的文件系統中,而後使用-v參數將宿主主機的/data/apps/bak掛載到容器backup做爲數據卷,最後經過tar 方式將/datas目錄下數據備份到宿主主機/data/apps/bak下。
3.2 數據卷數據恢復
一樣咱們若是要恢復數據到一個容器中,能夠這樣作,以下所示:
刪除data容器下/datas目錄下的數據:
root@srv-xjwy-dns-node01 bak]# docker exec data ls /datas/ test.txt [root@srv-xjwy-dns-node01 bak]# docker exec data rm -rf /datas/test.txt [root@srv-xjwy-dns-node01 bak]# docker exec data ls /datas/
而後建立一個容器recover,經過--volumes-form參數將data容器下的/datas目錄掛載,再經過-v選項將宿主主機的/data/apps/bak掛載,經過tar xvf命令將備份文件恢復到/datas下便可:
[root@srv-xjwy-dns-node01 ~]# docker run -it --volumes-from data -v /data/apps/bak:/backup --name recover centos:latest tar xvf /backup/backup.tar -C /datas/ datas/ datas/test.txt [root@srv-xjwy-dns-node01 ~]# docker exec data ls /datas/datas/ test.txt
如上,備份的數據成功的恢復到data數據卷容器中,在實際操做過程當中也能夠登陸容器手動將指定的備份文件恢復到數據卷容器中。
總結:在生產環境中,數據卷或數據卷容器是一種很好的容器間數據共享的解決方案,除此以外應按期將本地主機數據進行備份,或使用容錯存儲系統(RAID或分佈式文件系統),須要注意的是-v的用法,當僅僅須要建立數據卷時,直接使用-v 數據卷名便可,當掛載本地宿主主機目錄時,中間須要用「:」分開,若容器數據卷目錄不存在會自動建立!