1. 程式人生 > >Docker數據管理(五)

Docker數據管理(五)

並不會 容器數據 back 重復 自身 cee web 沒有 打包

一、什麽是數據卷

  生成環境中使用docker的過程中,往往需要對數據進行持久化,或者需要多個容器之間進行數據共享,這個就涉及到了容器數據管理

  容器中管理數據主要有兩種方式:

  1. 數據卷:容器內數據之間映射到本地主機環境
  2. 數據卷容器:使用特定的容器來維護數據卷

  數據卷是一個可供容器使用的特殊目錄,它將主機操作系統目錄直接映射進容器,類似Linux 的mount掛載

  數據卷的特性

  1. 數據卷可以在容器之間共享和重用,容器間傳遞數據將變得高效方便
  2. 對數據卷內數據的修改立馬生效,無論是容器內還是本地操作
  3. 對數據卷的更新不會影響鏡像,解耦了應用和數據
  4. 卷會一直存在,直到沒有容器使用,可以安全的卸載它

二、創建數據卷

  在用docker run 命令的時候,使用 -v 標記可以在容器內創建一個數據卷。多次重復使用 -v 標記可以創建多個數據卷

[root@rsync131 ~]# docker run -it -P -d --name web -v /opt/web/ centos
b0772ffc49ea226536a23ca5d73f1a69c4212407ad54ab406b1b098138e64a65

  PS:-P參數是將容器服務暴露的端口,是自動映射到本地主機的臨時端口

  也可以掛載主機目錄做我數據卷(經常使用的方式)

[root@rsync131 ~]# docker run -it -P -d --name web1 -v /opt/web:/opt/ centos
acb1b0f0c804ca2b9bbe8c1fe0373c6025c51342e138204e40e74ac9123c8854

  上面的命令是將主機的/opt/web 目錄掛載到容器的/opt/下,這樣是很方便的在你進行數據修改的是,直接修改本地文件就行了,容器直接就會同步了

  docker 掛載數據卷的默認權限是讀寫(rw) ,我們也可以改權限

[root@rsync131 ~]# docker run -it -P -d --name web2 -v /opt/web:/opt/:ro centos
8400a6999dbafe14dd6cb28796dc84595282361e619a8d183db405106e07d85d

  加了:ro 容器內對所掛載的數據卷內的數據就不能修改了

  也可以只掛載本地主機的單個文件到容器中作為數據卷(強烈不推薦,生產也很少用,可忽略)

[root@rsync131 ~]# docker run -it -P -d --name web4 -v /root/.bash_history:/.bash_history  centos
b5a45865eca2ad16cde207c9a35702667f3bd9b947383a33451b67098548331e

  

三、數據卷容器

  如果用戶需要在多個容器之間共享一些持續更新的數據,最簡單的方式是使用數據卷容器,數據卷容器也是個容器,但是它的目的是專門用來提供數據卷供其他容器掛載的

  首先創建一個數據卷容器

[root@rsync131 /]# docker run -it -d -v /dbdata --name dbdata centos
ea8c0b5014166f57afc5d7cf52b1ca532e0e0a259f414d2891d0ebf9dc397624
[root@rsync131 /]# docker exec -it ea8c0b5014166f57afc5d7cf52b1ca532e0e0a259f414d2891d0ebf9dc397624 bash
[root@ea8c0b501416 /]# ls
anaconda-post.log  bin  dbdata  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

  掛載

[root@rsync131 /]# docker run -it -d --volumes-from dbdata --name db1 centos
ad8b9458a39c85516f2dc88645af8f3725418d5f4bf058566b0cbc977352490c
[root@rsync131 /]# docker run -it -d --volumes-from dbdata --name db2 centos
b07899fb1a46aa5538fc82dceebc4e53d7abf74ab870e14f916a59a03d1fab45

  此時,容器db1和db2都掛載同一個數據卷到相同的/dbdata 目錄,三個容器任何一方在該目錄下進行操作,其他的容器都能看見

  測試

# db1 容器
[root@rsync131 /]# docker exec -it db1 bash
[root@ad8b9458a39c /]# cd /
[root@ad8b9458a39c /]# ls
anaconda-post.log  bin  dbdata  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@ad8b9458a39c /]# cd dbdata/
[root@ad8b9458a39c dbdata]# ls
[root@ad8b9458a39c dbdata]# touch  a.txt
[root@ad8b9458a39c dbdata]# ls
a.txt
[root@ad8b9458a39c dbdata]# exit
exit

# db2 容器
[root@rsync131 /]# docker exec -it db2 bash
[root@b07899fb1a46 /]# cd /d
dbdata/ dev/
[root@b07899fb1a46 /]# cd /dbdata/
[root@b07899fb1a46 dbdata]# ls
a.txt

  其實在有容器也可以對db1或者db2進行掛載

[root@rsync131 /]# docker run -it -d --volumes-from db1 --name db3 centos
95547b8422226a2f18dd71db4e8c551fd8df72771cf6001cfdfb963899b71477
[root@rsync131 /]# docker exec -it db3 bash
[root@95547b842222 /]# ls /dbdata/
a.txt

  --volumes-from 參數所掛載數據卷的容器自身並不需要保持正在運行

  如果刪除了掛載的容器(包括dbdata、db1和db2),數據卷並不會被自動的刪除,如果要刪除一個數據卷,必須在刪除最後一個還掛載著它的容器時使用docker rm -v命令來指定同時刪除關聯的容器

四、利用數據卷容器來遷移數據

4.1. 備份

  使用下面的命令來備份dbdata數據卷容器內的數據卷

[root@rsync131 ~]# docker run --volumes-from dbdata -v $(pwd):/backup --name backup1 centos tar zcvf /backup/backup.tar.gz /dbdata
/dbdata/
/dbdata/a.txt
[root@rsync131 ~]# ll
總用量 273540
-rw-------. 1 root root      1513 8月  20 20:25 anaconda-ks.cfg
-rw-r--r--  1 root root       142 9月  23 14:13 backup.tar.gz

# 具體的意思是:利用centos鏡像創建一個容器,使用--volumes-from dbdata參數來讓容器掛載dbdata容器的數據卷,使用-v 參數來掛載本地當前目錄到容器的/backup目錄,容器啟動後使用tar打包備份到本地目錄

4.2. 恢復

  為了恢復我們創建一個容器

[root@rsync131 ~]# docker run -it -d -v /dbdata --name db8 centos
042d3c9567154d047977e8097939215bef441d3206c81c6bca99b6d227501169
[root@rsync131 ~]# docker run --volumes-from db8 -v $(pwd):/backup centos tar zxvf /backup/backup.tar.gz
dbdata/
dbdata/a.txt
[root@rsync131 ~]# docker exec -it db8 bash
[root@042d3c956715 /]# ls
anaconda-post.log  bin  dbdata  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@042d3c956715 /]# cd dbdata/
[root@042d3c956715 dbdata]# ls
a.txt

  

Docker數據管理(五)