Docker數據管理

簡介 

  用戶在使用Docker的過程當中,每每須要能查看容器內應用產生的數據,或者須要把容器內的數據進行備份,甚至多個容器之間進行數據的共享,這必然涉及容器的數據管理操做。
  容器中管理數據主要有兩種方式:web

  1. 口數據卷(Data Volumes)
  2. 口數據卷容器(Data Volume Dontainers)

  本文將首先介紹如何在容器內建立數據卷,而且把本地的目錄或文件掛載到容器內的數據卷中。接下來,會介紹如何使用數據卷容器在容器和主機、容器和容器之間共享數據,並實現數據的備份和恢復。docker

數據卷

  數據卷是一個可供容器使用的特殊目錄,它繞過文件系統,能夠提供不少有用的特性:ubuntu

  1. 數據卷能夠在容器之間共享和重用。
  2. 對數據卷的修改會立馬生效。
  3. 對數據卷的更新,不會影響鏡像。
  4. 卷會一直存在,直到沒有容器使用。

  數據卷的使用,相似於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技術入門與實戰》
相關文章
相關標籤/搜索