Docker數據管理

Docker容器管理數據有兩種方式

  • 數據卷:容器內的數據直接映射到本地主機環境

  • 數據卷容器:使用特定容器維護數據卷


數據卷

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


數據卷的特性:

  • 數據卷可以在容器之間共享和重用,容器間傳遞數據將變得高效方便

  • 對數據卷內數據的修改會立馬生效,無論是容器操作還是本地操作

  • 對數據卷的更新不會影響鏡像,解耦了應用和數據

  • 卷會一直存在,知道沒有容器使用,可以安全的卸載它


容器內創建數據卷

使用 -v標記可以在容器內創建一個數據卷,多次重複使用-v標記可以創建多個數據卷

例如:

# docker run -itd --name web -v /webapp ubuntu 
e8baf9e93c2f80e22ec89be503f4de2a56b870cead2c74566aced5f3492add13

# docker ps -a  
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                    PORTS                    NAMES
e8baf9e93c2f        ubuntu              "/bin/bash"              3 seconds ago       Up 2 seconds                                       web

創建並啓動一個容器,名爲web,給容器創建了一個數據卷/webapp



# docker exec -it web  /bin/bash
root@e8baf9e93c2f:/# ls 
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr  webapp

連接到容器內,可以看到/webapp目錄已經創建了



掛載一個主機目錄作爲數據卷

# docker run -itd --name web02 -v /srv:/opt/srv ubuntu

連接到web02容器,查看/opt/srv目錄下是否跟本地數據一樣

# docker exec -it web02 /bin/bash

# ls /opt/srv/
apache-tomcat  guacamole-client-0.9.14.tar.gz  jdk    zabbix
cdh            guacamole-server-0.9.14.tar.gz  tools

在容器內創建test目錄

# mkdir test

# ls
apache-tomcat  guacamole-client-0.9.14.tar.gz  jdk   tools
cdh            guacamole-server-0.9.14.tar.gz  test  zabbix

退出容器,可以看到/srv目錄下多了test目錄

# ls /srv/
apache-tomcat  cdh  guacamole-client-0.9.14.tar.gz  guacamole-server-0.9.14.tar.gz  jdk  test  tools  zabbix

注意:將本地目錄掛載到容器內時,本地路徑必須是絕對路徑。如果本地目錄不存在,會自動創建,docker掛載數據卷的默認權限是讀寫,用戶也可以通過ro設置爲只讀

例如:

# docker run -itd --name web02 -v /srv:/opt/srv:ro  ubuntu


數據卷容器

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

首先創建一個數據卷容器

$ docker run -it -v /dbdata --name dbdata ubuntu

查看/dbdata目錄

root@768040a3ea7f:/# 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容器掛載數據卷

$ docker run -it --volumes-from dbdata --name db1 ubuntu

$ root@012c3b277461:/# ls
bin  boot  dbdata  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

可以看到db1這個容器有/dbdata目錄


同樣的方法,創建db2容器

$ docker run -it --volumes-from dbdata --name db2 ubuntu


在db1容器的/dbdata目錄下創建test目錄

root@012c3b277461:/# cd dbdata/
root@012c3b277461:/dbdata# ls
root@012c3b277461:/dbdata# mkdir test
root@012c3b277461:/dbdata# ls
test

在db2容器中可以看到/dbdata目錄下也有test目錄

root@f3aab4e96507:/# cd /dbdata/
root@f3aab4e96507:/dbdata# ls
test


注意:可以多次使用--volumes-from參數來從多個容器掛載多個數據卷。還可以從其他已經掛載了容器卷的容器來掛載數據卷,如

docker run -d --name db3 --volumes-from db1 ubuntu

使用--volumes-from參數所掛載的數據卷的容器自身並不需要保持運行狀態

刪除了掛載的容器,數據卷並不會被自動刪除。


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

備份

利用數據卷容器可以對其中數據捲進行備份、恢復,以實現數據的遷移。

 docker run --volumes-from dbdata -v $(pwd):/backup \
 --name worker ubuntu tar zcf /backup/backup.tar /dbdata

解析:使用Ubuntu鏡像創建一個容器worker。使用--volumes-from dbdata參數來讓worker容器掛載dbdata容器的數據卷,即/dbdata數據卷。

使用-v $(pwd):/backup將本機的當前目錄掛載到worker容器的/backup目錄。

worker容器啓動後,執行tar命令,將worker容器下掛載的/dbdata目錄中的數據壓縮備份到/backup目錄下,名爲backup.tar文件,而worker容器將/backup目錄掛載到宿主機的當前目錄了,所以backup.tar文件

也在本機的當前目錄下, 宿主機下執行ls命令,可以看到backup.tar文件

# ls
backup.tar


恢復

如果要將數據恢復到一個容器,執行下面的命令

# docker run -itd -v /data --name data1 centos:6
749852a07dedec5acb9249b3af8d0fd78783379922b048581e9734fd3c13335f

創建一個帶有空數據卷的容器data1


# docker run --volumes-from data1 -v $(pwd):/backup centos:6 \
tar xvf /backup/backup.tar -C /data
mynginx/
mynginx/zabbix-agent-3.0.8-2.el7.x86_64.rpm
mynginx/Dockerfile

再次創建一個容器,掛載data1的數據卷,然後將本地的當前目錄的掛載到容器的/backup目錄下,執行untar解壓縮命令,將本地的當前目錄下的backup.tar文件解壓縮到容器的/data目錄下,

這樣就恢復了數據卷容器中的數據

注意:很多文檔裏面沒有將數據解壓縮時,指定解壓縮到/data目錄,這樣恢復的數據不在/data目錄下。


可以創建並啓動一個新的容器,掛載到data1數據卷,查看/data目錄下是否有恢復過去的數據

# docker exec -it  wizardly_shockley /bin/bash

# ls
bin   dev  home  lib64       media  opt   root  selinux  sys  usr
data  etc  lib   lost+found  mnt    proc  sbin  srv      tmp  var

# ll /data
total 0
drwxr-xr-x 2 root root 65 Jun 13 03:13 mynginx






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章