用戶在使用Docker的過程當中,每每須要能查看容器內應用產生的數據,或者須要把容器內的數據進行備份,甚至多個容器之間進行數據的共享,這必然涉及容器的數據管理操做。
容器中管理數據主要有兩種方式:web
本文將首先介紹如何在容器內建立數據卷,而且把本地的目錄或文件掛載到容器內的數據卷中。接下來,會介紹如何使用數據卷容器在容器和主機、容器和容器之間共享數據,並實現數據的備份和恢復。docker
數據卷是一個可供容器使用的特殊目錄,它繞過文件系統,能夠提供不少有用的特性:ubuntu
數據卷的使用,相似於Linux下對目錄或文件進行mount操做。tomcat
在用docker run命令的時候,使用-v標記能夠在容器內建立一個數據卷。屢次使用-v標記能夠建立多個數據卷。
下面使用tomcat進項建立一個web容器,並建立一個數據卷掛載到容器的 /usr/local/tomcat/webapps 目錄:bash
sudo docker run -d -P -v /usr/local/tomcat/webapps tomcat:latest
使用 -v 標記也能夠指定掛載一個本地已有的目錄到容器中去做爲數據卷:app
sudo docker run -d -P -v /webapps:/usr/local/tomcat/webapps tomcat:latest
上面的命令加載主機的 /webapps 目錄到容器的 /usr/local/tomcat/webapps 目錄:
這個功能在進行測試的時候十分方便,好比用戶能夠放置一些程序或數據到本地目錄中,而後在容器內運行和使用。另外,本地目錄的路徑必須是絕對路徑,若是目錄不存在,Docker會自動建立。webapp
若是用戶須要在容器之間共享一些持續更新的數據,最簡單的方式是使用數據卷容器。
數據卷容器其實就是一個普通的容器,專門用它提供數據卷供其餘容器掛載使用方法以下。
首先,建立一個數據卷容器dbdata,並在其中建立一個數據卷掛載到/dbdata:學習
[root@gavin ~]# sudo docker run -it -v /dbdata --name dbdata ubuntu
root@7b2ebdc5e8ef:/#
查看 /dbdata 目錄:測試
root@7b2ebdc5e8ef:/# ls bin boot dbdata dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
而後,能夠在其餘容器中使用 --volumes-from來 掛載 dbdata 容器中的數據卷,例如建立db1和db2兩個容器,並從 dbdata 容器掛載數據卷:spa
[root@gavin ~]# sudo docker run -it --volumes-from dbdata --name db1 ubuntu [root@gavin ~]# sudo docker run -it --volumes-from dbdata --name db2 ubuntu
此時,容器db1和db2都掛載同一個數據捲到相同的/dbdata目錄。三個容器任何一方在該目錄下的寫入,其餘容器均可以看到。
例如,在dbdata容器中建立一個test文件:
[root@gavin ~]# sudo docker start dbdata [root@gavin ~]# sudo docker exec -ti dbdata /bin/bash root@7b2ebdc5e8ef:/# cd /dbdata/ root@7b2ebdc5e8ef:/dbdata# touch test root@7b2ebdc5e8ef:/dbdata# ls test
在 db1 容器內查看它:
[root@gavin ~]# sudo docker start db1 [root@gavin ~]# sudo docker exec -ti db1 /bin/bash root@dd4c44fa2677:/# cd /dbdata/ root@dd4c44fa2677:/dbdata# ls test
能夠屢次使用 --volumes-from 參數來從多個容器掛載多個數據卷。還能夠從其餘已經掛載了容器卷的容器來掛載數據卷:
[root@gavin ~]# sudo docker run -d --name db3 --volumes-from db1 ubuntu
注意:使用--volumes-from參數所掛載數據卷的容器自身並不須要保持在運行狀態。
若是刪除了掛載的容器(包括dbdata、db1和db2),數據卷並不會被自動刪除。若是要刪除一個數據卷,必須在刪除最後一個還掛載着它的容器時顯式使用 docker rm -v 命令來指定同時刪除關聯的容器。
能夠利用數據卷容器對其中的數據捲進行備份、恢復,以實現數據的遷移。
使用下面命令來備份 dbdata 數據卷容器內的數據卷:
[root@gavin ~]# sudo docker run --volumes-from dbdata -v /backup:/backup --name worker ubuntu tar cvf /backup/backup.tar /dbdata
個命令稍微有點複雜,具體分析下。
首先利用 ubuntu 鏡像建立了一個容器 worker。使用 --volumes-from dbdata 參數來讓 worker 容器掛載 dbdata 容器的數據卷(即 dbdata 數據卷);使用 -v
/backup:/backup 參數來掛載本地的 /backup 目錄到 worker 容器的 /backup 目錄。
worker容器啓動後,使用了tar cvf /backup/backup.tar /dbdata命令來將/dbdata下內容備份爲容器內的 /backup/backup.tar,即宿主主機當前目錄下的 /backup/backup.tar。
若是要恢復數據到一個容器,能夠按照下面的操做。首先建立一個帶有數據卷的容器dbdata2:
[root@gavin /]# sudo docker run -it -v /dbdata --name dbdata2 ubuntu /bin/bash
而後建立另外一個新的容器,掛載dbdata2的容器,並使用untar解壓備份文件到所掛載的容器卷中便可:
[root@gavin /]# sudo docker run --volumes-from dbdata2 -v /backup:/backup ubuntu tar xvf /backup/backup.tar
此時進入數據卷容器 dbdata2 能夠看到數據已經被恢復:
[root@gavin /]# sudo docker exec -ti dbdata2 /bin/bash root@d4ea504a0d06:/# cd dbdata/ root@d4ea504a0d06:/dbdata# ls test
這篇文章是我學習 Docker 的記錄,內容參考自《Docker技術入門與實戰》