如果有一天不小心執(zhí)行了docker rm $(docker ps -aq)刪除所有container. 那么Mysql里的數(shù)據(jù)也會(huì)被刪掉, 這是不安全的.
我們需要將數(shù)據(jù)持久化, 存儲(chǔ)在container外部. 即使刪除container也不會(huì)刪除原有的數(shù)據(jù).
二、容器的缺陷
容器中的數(shù)據(jù)可以存儲(chǔ)在容器層。但是將數(shù)據(jù)存放在容器層存在以下問(wèn)題:
1.數(shù)據(jù)不是持久化。意思是如果容器刪除了,這些數(shù)據(jù)也就沒(méi)了
2.主機(jī)上的其它進(jìn)程不方便訪問(wèn)這些數(shù)據(jù)
3.對(duì)這些數(shù)據(jù)的I/O會(huì)經(jīng)過(guò)存儲(chǔ)驅(qū)動(dòng),然后到達(dá)主機(jī),引入了一層間接層,因此性能會(huì)有所下降
三、data volume有兩種掛載方式:
1)bind mount(用戶管理):將宿主機(jī)上的某個(gè)目錄或文件(不可以是沒(méi)有格式化的磁盤(pán)文件),掛載到容器中,默認(rèn)在容器內(nèi)對(duì)此目錄是有讀寫(xiě)權(quán)限的,如果只需要向容器內(nèi)添加文件,不希望覆蓋目錄,需要注意源文件必須存在,否則會(huì)被當(dāng)做一個(gè)目錄bind mount給容器。
2)docker manager volume(docker自動(dòng)管理):不需要指定源文件,只需要指定mount point(掛載點(diǎn))。把容器里面的目錄映射到了本地。
這種方式相比bind mount 缺點(diǎn)是無(wú)法限制對(duì)容器里邊目錄或文件的權(quán)限。
使用第二種掛載方式,-v 掛載時(shí),不指定源文件位置,則默認(rèn)掛載的路徑是:
[root@sqm-docker01 _data]# pwd
/var/lib/docker/volumes/dd173640edd5b0205bb02f3c4139647be12528b38289b9f93f18123a6b1266a8/_data
#當(dāng)有目錄掛載時(shí),默認(rèn)在/var/lib/docker/volumes/下會(huì)生成一串hash值,hash值下有一個(gè)_data的目錄,容器內(nèi)映射的文件就在此路徑下。
四、Storage Driver
數(shù)據(jù)存儲(chǔ)方式
Centos7版本的docker,Storage Driver(數(shù)據(jù)存儲(chǔ)方式)為:overlay2 ,Backing Filesystem(文件系統(tǒng)類型): xfs
可使用 “docker inspect 容器名稱” 來(lái)查看數(shù)據(jù)存儲(chǔ)方式
五、Data Volume
(Bind mount)
持久化存儲(chǔ):本質(zhì)上是DockerHost文件系統(tǒng)中的目錄或文件,能夠直接被Mount到容器的文件系統(tǒng)中。在運(yùn)行容器時(shí),可通過(guò)-v實(shí)現(xiàn)。
特點(diǎn):
**1. Data Volume是目錄或文件,不能是沒(méi)有格式化的磁盤(pán)(塊設(shè)備)。
容器可以讀寫(xiě)volume中的數(shù)據(jù)。
Volume數(shù)據(jù)可以永久保存,即使使用它的容器已經(jīng)被銷毀。**
小實(shí)驗(yàn):
運(yùn)行一個(gè)nginx服務(wù),做數(shù)據(jù)持久化
(1)Data Volume是目錄或文件,不能是沒(méi)有格式化的磁盤(pán)(塊設(shè)備)。
[root@docker01 ~]# mkdir html
//創(chuàng)建測(cè)試目錄
[root@docker01 ~]# cd html/
[root@docker01 html]# echo This is a testfile in dockerHost. > index.html
//創(chuàng)建測(cè)試網(wǎng)頁(yè)
[root@docker01 ~]# docker run -itd --name testweb -v /root/html/:/usr/share/nginx/html nginx:latest
//運(yùn)行一個(gè)nginx容器,并掛載目錄
[root@docker01 ~]# docker inspect testweb
[root@docker01 ~]# curl 172.17.0.3
注意:dockerhost上需要被掛載的源文件或目錄,必須是已經(jīng)存在,否則,會(huì)被當(dāng)作一個(gè)目錄掛載到容器中。
(2)容器可以讀寫(xiě)volume中的數(shù)據(jù)。
[root@docker01 ~]# docker exec -it testweb /bin/bash
root@ef12d312a94e:/# cd /usr/share/nginx/html/
root@ef12d312a94e:/usr/share/nginx/html# echo update > index.html
//容器中更三五互聯(lián)頁(yè)
root@ef12d312a94e:/usr/share/nginx/html# exit
[root@docker01 ~]# cat html/index.html
//可以看到宿主目錄的掛載目錄也更新了
(3)Volume數(shù)據(jù)可以永久保存,即使,使用它的容器已經(jīng)被銷毀,也可以通過(guò)宿主機(jī)的掛在目錄重新啟動(dòng)一個(gè)容器掛載這個(gè)目錄進(jìn)行訪問(wèn)。
[root@docker01 ~]# docker ps -a -q |xargs docker rm -f
//刪除所有容器
[root@docker01 ~]# cat html/index.html
//容器刪除之后,宿主機(jī)的測(cè)試網(wǎng)頁(yè)也在
[root@docker01 ~]# docker run -itd --name t1 -P -v /root/html/:/usr/share/nginx/html nginx:latest
//基于測(cè)試網(wǎng)頁(yè)創(chuàng)建一個(gè)容器
[root@docker01 ~]# docker ps
[root@docker01 ~]# curl 127.0.0.1:32768
//訪問(wèn)一下
[root@docker01 ~]# echo update-new > html/index.html
//再次更新測(cè)試網(wǎng)頁(yè)
[root@docker01 ~]# curl 127.0.0.1:32768
//在宿主機(jī)更新測(cè)試網(wǎng)頁(yè),剛剛創(chuàng)建的容器的測(cè)試網(wǎng)頁(yè)也會(huì)更新
(5)默認(rèn)掛載到容器內(nèi)的文件,容器是有讀寫(xiě)權(quán)限。可以在運(yùn)行容器是-v 后邊加“:ro”限制容器的寫(xiě)入權(quán)限
[root@docker01 ~]# docker run -itd --name t2 -P -v /root/html/:/usr/share/nginx/html:ro nginx:latest
//創(chuàng)建容器設(shè)置指讀權(quán)限
[root@docker01 ~]# docker exec -it t2 /bin/bash
//進(jìn)入容器
root@4739c0f5d970:/# cd /usr/share/nginx/html
root@4739c0f5d970:/usr/share/nginx/html# echo 1234 > index.html
//修改測(cè)試網(wǎng)頁(yè)(失敗,因?yàn)槭侵蛔x的)
[root@docker01 ~]# echo 654321 > html/index.html
//宿主機(jī)可以更改
[root@docker01 ~]# curl 127.0.0.1:32768
(6)并且還可以掛載單獨(dú)的文件到容器內(nèi)部,一般他的使用場(chǎng)景是:如果不想對(duì)整個(gè)目錄進(jìn)行覆蓋,而只希望添加某個(gè)文件,就可以使用掛載單個(gè)文件。
<1>測(cè)試1
[root@docker01 ~]# docker run -itd --name v6 -P -v /root/html/index.html:/usr/share/nginx/html/index.html nginx:latest
[root@docker01 ~]# docker ps
[root@docker01 ~]# curl 127.0.0.1:32770
<1>測(cè)試2
[root@docker01 ~]# echo test > test.html
[root@docker01 ~]# docker run -itd --name t8 -P -v /root/test.html:/usr/share/nginx/html/test.html nginx:latest
[root@docker01 ~]# curl 127.0.0.1:32772/test.html
六,Docker Manager Volume
會(huì)自動(dòng)在宿主機(jī)生成目錄,所以在掛載目錄的時(shí)候只用寫(xiě)容器中的目錄。
特性和上邊的bind mount基本一樣
[root@docker01 ~]# docker run -itd --name t1 -P -v /usr/share/nginx/html nginx:latest
[root@docker01 ~]# docker ps
[root@docker01 ~]# docker inspect t1
[root@docker01 _data]# cd /var/lib/docker/volumes/17c50a065a6b10ccd01ca1ce8091fdf6282dc9dcb77a0f6695906257ecc03a63/_data
[root@docker01 _data]# echo this is a testfile > index.html
[root@docker01 _data]# docker ps
[root@docker01 _data]# curl 127.0.0.1:32777
[root@docker01 _data]# docker volume ls
[root@docker01 _data]# docker rm t1 -f
[root@docker01 _data]# cat index.html
1.刪除容器的操作,默認(rèn)不會(huì)對(duì)dockerhost上的源文件操作,如果想要在刪除容器時(shí)把源文件也刪除,可以在刪除容器時(shí)添加-v選項(xiàng)(一般不推薦使用這種方式,因?yàn)槲募锌赡鼙黄渌萜魇褂茫?/p>
[root@docker01 _data]# docker run -itd --name t2 -P -v /usr/share/nginx/html nginx:latest
[root@docker01 ~]# docker inspect t2
[root@docker01 ~]# cd /var/lib/docker/volumes/2781dbfdc673fc7d149dc4f6217ef277fe72e05ba2e20fcebb617afe97eccb30/_data
[root@docker01 _data]# docker rm -v t2 -f
t2
[root@docker01 _data]# ls
七,容器與容器的數(shù)據(jù)共享
Volume container:給其他容器提供volume存儲(chǔ)卷的容器。并且它可以提供bind mount,也可以提供docker manager volume。
創(chuàng)建一個(gè)vc_data容器
[root@docker01 ~]# docker create --name vc_data -v ~/html:/usr/share/nginx/html -v /other/useful/tools busybox
[root@docker01 ~]# docker inspect vc_data
[root@docker01 ~]# docker run -itd --name t3 -P --volumes-from vc_data nginx:latest
[root@docker01 ~]# docker ps
[root@docker01 ~]# curl 127.0.0.1:32779
八,容器的跨主機(jī)數(shù)據(jù)共享
實(shí)驗(yàn)環(huán)境
httpd
nfs
要求:docker01和docker02的主目錄,是一樣的。
準(zhǔn)備工作
[root@localhost ~]# hostnamectl set-hostname nfs
[root@localhost ~]# hostnamectl set-hostname docker01
[root@localhost ~]# hostnamectl set-hostname docker02
nfs操作
[root@localhost ~]# yum -y install nfs-utils
//下載nfs服務(wù)
[root@nfs ~]# mkdir /datashare
//創(chuàng)建共享目錄
[root@nfs ~]# vim /etc/exports
//設(shè)置權(quán)限如下
/datashare *(rw,sync,no_root_squash)
開(kāi)啟各項(xiàng)服務(wù)
[root@nfs ~]# systemctl start rpcbind
[root@nfs ~]# systemctl enable rpcbind
[root@nfs ~]# systemctl start nfs-server
[root@nfs ~]# systemctl enable nfs-server
docker01和docker02測(cè)試nfs
[root@docker01 htdocs]# showmount -e 192.168.1.20
[root@docker02 htdocs]# showmount -e 192.168.1.20
docker01的操作
[root@docker02 ~]# mkdir /xxx
[root@docker01 ~]# mount -t nfs 192.168.1.10:/datashare /xxx
//掛載nfs上的共享目錄
[root@docker01 ~]# mount | tail -1
//查看是否掛載
nfs創(chuàng)建測(cè)試文件
[root@nfs ~]# cd datashare/
[root@nfs datashare]# vim index.html
<div id=datetime>
<script>
setInterval(document.getElementById(\\\'datetime\\\').innerHTML=new Date().toLocaleString();, 1000);
</script>
</div>
xgp666
docker01查看一下
docker02的操作與docker01上一樣
這里先不考慮將代碼寫(xiě)入鏡像,先以這種方式,分別在docker01和docker02部署httpd服務(wù)
[root@docker01 ~]# docker run -itd --name bdqn-web1 -P -v /xxx/:/usr/local/apache2/htdocs httpd:latest
[root@docker02 ~]# docker run -itd --name bdqn-web2 -P -v /xxx/:/usr/local/apache2/htdocs httpd:latest
[root@docker01 ~]# docker ps
//查看端口
0.0.0.0:32775->80/tcp bdqn-web
[root@docker02 ~]# docker ps
//查看端口
0.0.0.0:32769->80/tcp bdqn-web2
此時(shí),用瀏覽器訪問(wèn),兩個(gè)WEB服務(wù)的主界面是一樣。但如果,NFS服務(wù)器上的源文件丟失,
則兩個(gè)web服務(wù)都會(huì)異常。
想辦法將元數(shù)據(jù)寫(xiě)入鏡像內(nèi),在基于鏡像創(chuàng)建一個(gè)vc_data容器,這里因?yàn)闆](méi)有接觸到docker-compose和docker-swarm等docker編排工具,所以需手動(dòng)創(chuàng)建鏡像!
nfs操作
[root@nfs datashare]# echo xgp666 > index.html
//更改測(cè)試文件
docker02操作
[root@docker02 ~]# cd /xxx/
[root@docker02 xxx]# vim Dockerfile
//編寫(xiě)Dockerfile
[root@docker02 xxx]# cat Dockerfile
FROM busybox
ADD index.html /usr/local/apache2/htdocs/index.html
VOLUME /usr/local/apache2/htdocs
創(chuàng)建鏡像并運(yùn)行一個(gè)容器
[root@docker02 xxx]# docker build -t back_data .
//基于Dockerfile創(chuàng)建鏡像
[root@docker02 xxx]# docker create --name back_container1 back_data:latest
//基于剛剛創(chuàng)建的鏡像創(chuàng)建容器
運(yùn)行容器,并導(dǎo)出鏡像
[root@docker02 xxx]# docker run -itd --name bdqn-web3 -P --volumes-from back_container1 httpd:latest
//運(yùn)行一臺(tái)容器
[root@docker02 xxx]# docker save > back_data.tar back_data:latest
//導(dǎo)出鏡像,因?yàn)槭窃诠蚕砟夸浰詃ocker01也可以看到
docker01
[root@docker01 xxx]# docker load -i back_data.tar
//去共享目錄,導(dǎo)入鏡像
[root@docker01 xxx]# docker create --name back_container2 back_data:latest
//基于剛剛創(chuàng)建的鏡像運(yùn)行容器
[root@docker01 xxx]# docker run -itd --name bdqn-web4 -P --volumes-from back_container2 httpd:latest
//運(yùn)行一臺(tái)容器
瀏覽器訪問(wèn)
[root@docker01 ~]# docker ps
//查看端口
0.0.0.0:32776->80/tcp bdqn-web4
[root@docker02 ~]# docker ps
//查看端口
0.0.0.0:32770->80/tcp bdqn-web3
更多關(guān)于云服務(wù)器,域名注冊(cè),虛擬主機(jī)的問(wèn)題,請(qǐng)?jiān)L問(wèn)三五互聯(lián)官網(wǎng):m.shinetop.cn