目錄
一、數(shù)據(jù)卷(容器與宿主機(jī)之間數(shù)據(jù)共享)
二、數(shù)據(jù)卷容器(容器與容器之間數(shù)據(jù)共享)
三、 容器互聯(lián)(使用centos鏡像)
總結(jié)
用戶在使用Docker的過(guò)程中,往往需要能查看容器內(nèi)應(yīng)用產(chǎn)生的數(shù)據(jù),或者需要把容器內(nèi)的數(shù)據(jù)進(jìn)行備份,甚至多個(gè)容器之間進(jìn)行數(shù)據(jù)的共享,這必然涉及容器的數(shù)據(jù)管理操作。
容器中管理數(shù)據(jù)主要有兩種方式:
- 數(shù)據(jù)卷(Data Volumes)
- 數(shù)據(jù)卷容器(Data Volume Dontainers)
一、數(shù)據(jù)卷(容器與宿主機(jī)之間數(shù)據(jù)共享)
數(shù)據(jù)卷是一個(gè)供容器使用的特殊目錄,位于容器中??蓪⑺拗鳈C(jī)的目錄掛載到數(shù)據(jù)卷上,對(duì)數(shù)據(jù)卷的修改操作立刻可見(jiàn),并且更新數(shù)據(jù)不會(huì)影響鏡像,從而實(shí)現(xiàn)數(shù)據(jù)在宿主機(jī)與容器之間的遷移。數(shù)據(jù)卷的使用類(lèi)似于Linux下對(duì)目錄進(jìn)行的mount操作。
想要將容器中的數(shù)據(jù)持久化,可以將宿主機(jī)目錄掛載到容器中。
一般只建議在創(chuàng)建容器時(shí)進(jìn)行掛載,不建議啟動(dòng)容器后再掛載。因?yàn)閱?dòng)容器后再掛載的話,需要修改配置文件,且不一定能掛載成功。
docker run -v 數(shù)據(jù)卷 ???????????? #在容器內(nèi)創(chuàng)建數(shù)據(jù)卷 ?? ?docker run -v 宿主機(jī)目錄:數(shù)據(jù)卷 ?? #將宿主機(jī)目錄掛載到容器中 ?#注意:宿主機(jī)本地目錄的路徑必須是使用絕對(duì)路徑。如果路徑不存在,Docker會(huì)自動(dòng)創(chuàng)建相應(yīng)的路徑。 ?#掛載后的目錄默認(rèn)可讀可寫(xiě) ? ?#如果希望掛載后的目錄為只讀目錄,可以在掛載時(shí)加:ro參數(shù) ?docker run -v 宿主機(jī)目錄:數(shù)據(jù)卷:ro ?? #將宿主機(jī)目錄掛載到容器中,只可讀
示例:
[root@yuji ~]# ls /var/share ???? #創(chuàng)建數(shù)據(jù)卷前,該目錄不存在 ?ls: 無(wú)法訪問(wèn)/var/share: 沒(méi)有那個(gè)文件或目錄 ?? ?#將宿主機(jī)目錄/var/share掛載到容器中的/data1。 ?#注意:宿主機(jī)本地目錄的路徑必須是使用絕對(duì)路徑。如果路徑不存在,Docker會(huì)自動(dòng)創(chuàng)建相應(yīng)的路徑。 ?#-v選項(xiàng)可以在容器內(nèi)創(chuàng)建數(shù)據(jù)卷 ?[root@yuji ~]# docker run -v /var/share:/data1 --name web1 -itd centos:7 /bin/bash ?670bf71814364638c4b21a1fb13bcf95c6a2125cd379a5717061d41f9673b0fe ?[root@yuji ~]# ls /var/share -d ????#自動(dòng)創(chuàng)建了該目錄 ?/var/share ?#進(jìn)入容器 ?[root@yuji ~]# docker exec -it web1 bash? ?[root@670bf7181436 /]# ls ?????????? #容器中自動(dòng)創(chuàng)建了/data1目錄 ?anaconda-post.log ?data1 ?etc ??lib ?? media ?opt ??root ?sbin ?sys ?usr ?bin ?????????????? dev ?? home ?lib64 ?mnt ?? proc ?run ??srv ??tmp ?var ?[root@670bf7181436 /]# echo "this is web1"> /data1/abc.txt ??#向數(shù)據(jù)卷中寫(xiě)入數(shù)據(jù) ?[root@670bf7181436 /]# exit ?? #退出容器 ?exit ?#返回宿主機(jī)進(jìn)行查看 ?[root@yuji ~]# cd /var/share ?[root@yuji share]# ls ?abc.txt ?[root@yuji share]# cat abc.txt ???? #可以看到容器中寫(xiě)入的數(shù)據(jù),數(shù)據(jù)同步成功 ?this is web1 ?? ?? ?#在宿主機(jī)目錄中寫(xiě)入數(shù)據(jù),之后進(jìn)容器中查看 ?[root@yuji share]# cp /etc/passwd ./ ?[root@yuji share]# ls ?abc.txt ?passwd ?[root@yuji share]# docker exec -it web1 bash ???? #進(jìn)入容器 ?[root@670bf7181436 /]# ls /data1 ?? ?abc.txt ?passwd ????????????????????#完成了數(shù)據(jù)同步
二、數(shù)據(jù)卷容器(容器與容器之間數(shù)據(jù)共享)
如果需要在容器之間共享一些數(shù)據(jù),最簡(jiǎn)單的方法就是使用數(shù)據(jù)卷容器。數(shù)據(jù)卷容器是一個(gè)普通的容器,專(zhuān)門(mén)提供數(shù)據(jù)卷給其他容器掛載使用。
#創(chuàng)建數(shù)據(jù)卷容器web2。創(chuàng)建/data1和/data2兩個(gè)數(shù)據(jù)卷。 ?docker run --name web2 -v /data1 -v /data2 -itd centos:7 ?docker exec -it web2 bash ???????????????#進(jìn)入web2容器 ?echo "this is web2" > /data1/aaa.txt ????#向數(shù)據(jù)卷/data1中寫(xiě)入數(shù)據(jù) ?echo "this is yuji" > /data2/bbb.txt ????#向數(shù)據(jù)卷/data2中寫(xiě)入數(shù)據(jù) ?? ?#使用--volumes-from 來(lái)掛載web2容器中的數(shù)據(jù)卷到新的容器web3 ?docker run -itd --volumes-from web2 --name web3 centos:7 ?docker exec -it web3 bash ??????#進(jìn)入web3容器 ?cat /data1/aaa.txt ?????????????#查看/data1中的數(shù)據(jù)是否和web2一致 ?cat /data2/bbb.txt ?????????????#查看/data2中的數(shù)據(jù)是否和web2一致
#在容器web3的掛載目錄中寫(xiě)入數(shù)據(jù),觀察web2中能否同步成功 ?[root@e99ee4f80519 /]# echo "this is web3" > /data1/web3.txt ?[root@e99ee4f80519 /]# exit ?exit ?[root@yuji ~]# docker exec -it web2 bash ? ? #進(jìn)入容器web2 ?[root@146f1012bc08 /]# cat /data1/web3.txt ? #數(shù)據(jù)共享成功 ?this is web3
三、 容器互聯(lián)(使用centos鏡像)
容器互聯(lián)是通過(guò)容器的名稱(chēng)在容器間建立一條專(zhuān)門(mén)的網(wǎng)絡(luò)通信隧道。簡(jiǎn)單點(diǎn)說(shuō),就是會(huì)在源容器和接收容器之問(wèn)建立一條隧道,接收容器可以看到源容器指定的信息。
示例1:做容器互聯(lián)
#創(chuàng)建并運(yùn)行源容器取名c1 ?docker run -itd -P --name c1 centos:7 /bin/bash ?#創(chuàng)建并運(yùn)行接收容器取名c2,使用--1ink選項(xiàng)指定連接容器c1以實(shí)現(xiàn)容器互聯(lián)。 ?docker run -itd -P --name c2 --link c1:C1 centos:7 /bin/bash ?##--link 容器名:連接的別名 ?? ?#進(jìn)c2容器,ping c1,通過(guò)容器名稱(chēng)或者別名都可以通信 ?docker exec -it c2 bash ?ping c1 ???????#ping c1容器名稱(chēng) ?ping C1 ???????#ping c1容器的別名 ?PING C1 (172.17.0.5) 56(84) bytes of data. ?64 bytes from C1 (172.17.0.5): icmp_seq=1 ttl=64 time=0.105 ms ?64 bytes from C1 (172.17.0.5): icmp_seq=2 ttl=64 time=0.066 ms ?#可以看到c1容器的IP地址為172.17.0.5 ?? ?#進(jìn)入c1容器,查看c1的IP地址 ?docker exec -it c1 bash ?yum install -y net-tools ??#下載網(wǎng)絡(luò)工具 ?ifconfig ??????????????????#查看IP為172.17.0.5,和c2中顯示的一致 ?eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> ?mtu 1500 ???????? inet 172.17.0.5 ?netmask 255.255.0.0 ?broadcast 172.17.255.255
示例2:如果不做互聯(lián)的話只能通過(guò)IP進(jìn)行通信
#創(chuàng)建容器c5,沒(méi)有與c1做互聯(lián) ?docker run -itd -P --name c5 centos:7 /bin/bash ?docker exec -it c5 bash ?????#進(jìn)入容器c5 ?#通過(guò)c1的容器名稱(chēng)和別名,都無(wú)法和c1通信 ?ping c1 ???? ? #提示:ping: c1: Name or service not known ?ping C1 ???? ? #提示:ping: C1: Name or service not known ?#只能通過(guò)IP進(jìn)行通信 ?ping 172.17.0.5
總結(jié)
本文介紹了通過(guò)數(shù)據(jù)卷和數(shù)據(jù)卷容器對(duì)容器內(nèi)數(shù)據(jù)進(jìn)行共享、備份和恢復(fù)等操作,通過(guò)這些機(jī)制,即使容器在運(yùn)行中出現(xiàn)故障,用戶也不必?fù)?dān)心數(shù)據(jù)發(fā)生丟失,只需要快速地重新創(chuàng)建容器即可。
命令 | 說(shuō)明 |
---|---|
docker run -v 宿主機(jī)目錄:數(shù)據(jù)卷 | 將宿主機(jī)目錄掛載到容器中 |
docker run -v 數(shù)據(jù)卷 | 創(chuàng)建數(shù)據(jù)卷容器 |
docker run --volumes-from 數(shù)據(jù)卷容器 | 掛載數(shù)據(jù)卷容器(掛載點(diǎn)路徑不變) |
docker run --link 源容器名稱(chēng):別名 | 容器互聯(lián) |
注意:一般只建議在創(chuàng)建容器時(shí)進(jìn)行掛載,不建議啟動(dòng)容器后再掛載。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-680027.html
因?yàn)閱?dòng)容器后再掛載的話,需要修改配置文件,且不一定能掛載成功。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-680027.html
到了這里,關(guān)于【云原生】Docker的數(shù)據(jù)管理(數(shù)據(jù)卷、容器互聯(lián))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!