Docker系列八: 數據卷

什麼是數據卷

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

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

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

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

  數據卷的特性安全

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

 

建立數據卷

在用docker run 命令的時候,使用 -v 標記能夠在容器內建立一個數據卷。屢次重複使用 -v 標記能夠建立多個數據卷bash

[root@rsync131 ~]# docker run -it -P -d --name web -v /opt/web/ centos
b0772ffc49ea226536a23ca5d73f1a69c4212407ad54ab406b1b098138e64a65
PS:-P參數是將容器服務暴露的端口,是自動映射到本地主機的臨時端口

  也能夠掛載主機目錄作我數據卷(常常使用的方式)post

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

 

 

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

  docker 掛載數據卷的默認權限是讀寫(rw) ,咱們也能夠改權限操作系統

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

 

 

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

  也能夠只掛載本地主機的單個文件到容器中做爲數據卷(強烈不推薦,生產也不多用,可忽略)code

[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 目錄,三個容器任何一方在該目錄下進行操做,其餘的容器都能看見

 

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

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

 

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

備份

[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打包備份到本地目錄

 

恢復

[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
相關文章
相關標籤/搜索