Docker基础-Docker数据管理
1、數據卷
數據卷是一個可供容器使用的特殊目錄,它將主機操作系統目錄直接映射進容器,類似于Linux中的mount操作。
數據卷可以提供很多有用的特性:
1.在容器內創建一個數據卷
在使用docker run命令的時候,使用-v參數在容器內創建一個數據卷。多次重復使用可以創建多個數據卷。
舉例如下:
可以看到容器里內已經存在一個數據卷:nginxdata
-p參數是暴露指定的容器服務端口到宿主機,其中 -p 80:80中,:前面的是宿主機的端口,:后面的是容器內暴露的端口,可以理解為將容器內暴露的端口綁定到宿主機。
2.掛載一個主機目錄作為數據卷
使用-v參數也可以指定掛載一個本地目錄到容器中去作為數據卷(推薦方式)。
舉例如下:
上面的:-v /data/nginxdata/:/opt/nginxdata是指將本地的/data/nginxdata/掛載到容器中的/opt/nginxdata作為數據卷。
在容器nginx_3中的/opt/nginxdata目錄中創建一個test.txt并寫入"write in container"然后退出容器,在/data/nginxdata/中也存在這個文件和內容。
當然,在本地寫入數據之后,在容器中也是立即生效的:
3.掛載一個本地文件作為數據卷
-v參數也可以指定一個本地文件掛載到容器中作為數據卷(不推薦)。
[root@docker ~]# docker run --rm -itd --name nginx_4 -v /data/nginxdata/index.html:/usr/share/nginx/html/index.html -p 8084:80 nginx:latest 9838611b1230ad85c96a4215151c281199e330c4b101b9e13f4179976aa338b3 [root@docker ~]# 把指定的index.html文件掛載到容器中nginx的網站空間/usr/share/nginx/html/中,并把原先的index.html替換掉了。
注意:
如果直接掛載一個文件到容器中,使用文件編輯工具,包括vi、vim或者sed --in-place的時候可能會造成文件inode的改變,從Dcker1.1.0起,會報錯;推薦使用的方式是直接掛載文件所在的目錄。
2、數據卷容器
如果用戶需要在多個容器之間共享一些持續更新的數據,最簡單的方式是使用數據卷容器。數據卷容器也是一個容器,但是它的目的是專門用來提供數據卷供其他容器掛載。
首先,創建一個數據卷容器,并在容器內創建一個數據卷掛載到/dbdata:
查看/dbdata目錄:
[root@695f96ac5b87 /]# ls anaconda-post.log bin dbdata dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var [root@695f96ac5b87 /]# cd dbdata/ [root@695f96ac5b87 dbdata]# ls [root@695f96ac5b87 dbdata]# 在其他容器中使用--volumes-from來掛載dbdata容器中的數據卷:
創建db1和db2兩個容器,都掛載在dbdata上,可以在兩個容器中都能看到dbdata目錄:
在dbdata容器的dbdata目錄中寫入數據:
[root@695f96ac5b87 /]# cd /dbdata/ [root@695f96ac5b87 dbdata]# ls [root@695f96ac5b87 dbdata]# echo "write in dbdata:/dbdata" > test.txt [root@695f96ac5b87 dbdata]# cat test.txt write in dbdata:/dbdata [root@695f96ac5b87 dbdata]#分別在db1和db2中查看:
db1中查看:
[root@docker ~]# docker exec -it db1 /bin/bash [root@6adc3ecfe19d /]# ls anaconda-post.log bin dbdata dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var [root@6adc3ecfe19d /]# cd dbdata/ [root@6adc3ecfe19d dbdata]# ls test.txt [root@6adc3ecfe19d dbdata]# cat test.txt write in dbdata:/dbdata [root@6adc3ecfe19d dbdata]# echo "write in db1:/dbdata" >> test.txt [root@6adc3ecfe19d dbdata]# cat test.txt write in dbdata:/dbdata write in db1:/dbdata [root@6adc3ecfe19d dbdata]#db2中查看:
[root@docker ~]# docker exec -it db2 /bin/bash [root@c9cade8bc911 /]# cd dbdata/ [root@c9cade8bc911 dbdata]# ls test.txt [root@c9cade8bc911 dbdata]# cat test.txt write in dbdata:/dbdata write in db1:/dbdata [root@c9cade8bc911 dbdata]# echo "write in db2:/dbdata" >> test.txt [root@c9cade8bc911 dbdata]# cat test.txt write in dbdata:/dbdata write in db1:/dbdata write in db2:/dbdata [root@c9cade8bc911 dbdata]#最后在dbdata容器中查看分別在db1和db2中寫入的數據:
[root@695f96ac5b87 dbdata]# cat test.txt write in dbdata:/dbdata write in db1:/dbdata write in db2:/dbdata [root@695f96ac5b87 dbdata]# 可以多次使用--volumes-from參數來從多個容器掛載多個數據卷。還可以從其他已經掛載了容器卷的容器來掛載數據卷。
舉例如下:
注意:
1.使用--volumes-from參數所掛載數據卷的容器自身并不需要保持在運行狀態。
2.如果刪除了掛載的容器(包括dbdata、db1和db2),數據卷并不會自動刪除。如果要刪除一個數據卷,必須在刪除最后一個還掛載著它的容器時使用docker rm -v命令來指定同時刪除關聯的容器。
3、利用數據卷容器來遷移數據
可以利用數據卷容器對其中的數據卷進行備份、恢復,以實現數據的遷移。=
1.備份
[root@docker ~]# docker run --volumes-from dbdata -v $(pwd):/backup --name worker centos:latest tar zcf backup/backup.tar dbdata命令解釋:
1.首先利用centos:latest鏡像創建了一個名為worker的容器,使用--volumes-from參數讓worker容器掛載dbdata容器的數據卷/dbdata,使用-v $(pwd):/backup參數來掛載本地當前目錄到worker容器的/backup目錄。 2.worker容器啟動后,使用了tar zcf backup/backup.tar /dbdata命令來將/dbdata下內容備份到/backup/backup.tar,即當前目錄下會生成一個backup.tar的文件。查看本地當前目錄:
[root@docker ~]# ll total 525288 -rw-------. 1 root root 1071 Jan 19 2017 anaconda-ks.cfg -rw-r--r-- 1 root root 180 Nov 29 12:11 backup.tar -rw-r--r-- 1 root root 109 Nov 29 10:00 daemon.json -rwxr-xr-x 1 root root 67 Nov 28 16:13 docker-pid [root@docker ~]#2.恢復
要將備份好的數據恢復到一個容器,先要創建一個帶有數據卷的容器dbdata2,然后另建一個新的容器,掛載dbdata2的,并使用untar解壓備份文件到所掛載的容器卷中。
舉例如下:
在新的數據卷容器dbdata2中可以查案恢復結果:
[root@docker ~]# docker exec -it dbdata2 /bin/bash [root@60919fece4a7 /]# ls anaconda-post.log bin dbdata dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var [root@60919fece4a7 /]# cd dbdata/ [root@60919fece4a7 dbdata]# ls test.txt [root@60919fece4a7 dbdata]# cat test.txt write in dbdata:/dbdata write in db1:/dbdata write in db2:/dbdata [root@60919fece4a7 dbdata]#?
轉載于:https://www.cnblogs.com/jie-fang/p/7920201.html
總結
以上是生活随笔為你收集整理的Docker基础-Docker数据管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 统计语言模型(Statistical L
- 下一篇: POJ2417 Discrete Log