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