內置跨主機的網(wǎng)絡(luò )通信一直是Docker備受期待的功能,在1.9版本之前,社區中就已經(jīng)有許多第三方的工具或方法嘗試解決這個(gè)問(wèn)題,例如Macvlan、Pipework、Flannel、Weave等。
雖然這些方案在實(shí)現細節上存在很多差異,但其思路無(wú)非分為兩種: 二層VLAN網(wǎng)絡(luò )和Overlay網(wǎng)絡(luò )
簡(jiǎn)單來(lái)說(shuō),二層VLAN網(wǎng)絡(luò )解決跨主機通信的思路是把原先的網(wǎng)絡(luò )架構改造為互通的大二層網(wǎng)絡(luò ),通過(guò)特定網(wǎng)絡(luò )設備直接路由,實(shí)現容器點(diǎn)到點(diǎn)的之間通信。這種方案在傳輸效率上比Overlay網(wǎng)絡(luò )占優(yōu),然而它也存在一些固有的問(wèn)題。
這種方法需要二層網(wǎng)絡(luò )設備支持,通用性和靈活性不如后者。
由于通常交換機可用的VLAN數量都在4000個(gè)左右,這會(huì )對容器集群規模造成限制,遠遠不能滿(mǎn)足公有云或大型私有云的部署需求; 大型數據中心部署VLAN,會(huì )導致任何一個(gè)VLAN的廣播數據會(huì )在整個(gè)數據中心內泛濫,大量消耗網(wǎng)絡(luò )帶寬,帶來(lái)維護的困難。
相比之下,Overlay網(wǎng)絡(luò )是指在不改變現有網(wǎng)絡(luò )基礎設施的前提下,通過(guò)某種約定通信協(xié)議,把二層報文封裝在IP報文之上的新的數據格式。這樣不但能夠充分利用成熟的IP路由協(xié)議進(jìn)程數據分發(fā);而且在Overlay技術(shù)中采用擴展的隔離標識位數,能夠突破VLAN的4000數量限制支持高達16M的用戶(hù),并在必要時(shí)可將廣播流量轉化為組播流量,避免廣播數據泛濫。
因此,Overlay網(wǎng)絡(luò )實(shí)際上是目前最主流的容器跨節點(diǎn)數據傳輸和路由方案。
容器在兩個(gè)跨主機進(jìn)行通信的時(shí)候,是使用overlay network這個(gè)網(wǎng)絡(luò )模式進(jìn)行通信;如果使用host也可以實(shí)現跨主機進(jìn)行通信,直接使用這個(gè)物理的ip地址就可以進(jìn)行通信。overlay它會(huì )虛擬出一個(gè)網(wǎng)絡(luò )比如10.0.2.3這個(gè)ip地址。在這個(gè)overlay網(wǎng)絡(luò )模式里面,有類(lèi)似于服務(wù)網(wǎng)關(guān)的地址,然后把這個(gè)包轉發(fā)到物理服務(wù)器這個(gè)地址,最終通過(guò)路由和交換,到達另一個(gè)服務(wù)器的ip地址。
要實(shí)現overlay網(wǎng)絡(luò ),我們會(huì )有一個(gè)服務(wù)發(fā)現。比如說(shuō)consul,會(huì )定義一個(gè)ip地址池,比如10.0.2.0/24之類(lèi)的。上面會(huì )有容器,容器的ip地址會(huì )從上面去獲取。獲取完了后,會(huì )通過(guò)ens33來(lái)進(jìn)行通信,這樣就可以實(shí)現跨主機的通信。
consul通過(guò)docker部署在cdh1,首先需要修改cdh1中的docker配置并重啟
[root@cdh1 /]# vim /etc/docker/daemon.json //添加以下配置 "live-restore":true [root@cdh1 /]# systemctl restart docker
“l(fā)ive-restore”:true 此配置的作用為在docker守護程序停止或重啟的時(shí)候,容器依然可以保持運行
在cdh1下載consul鏡像并啟動(dòng)
[root@cdh1 /]# docker pull consul [root@cdh1 /]# docker run -d -p 8500:8500 -h consul --name consul consul
修改cdh1中的docker配置并重啟
[root@cdh1 /]# vim /etc/docker/daemon.json # 添加以下兩行配置 "cluster-store": "consul://10.30.10.111:8500" "cluster-advertise": "10.30.10.111:2375" [root@cdh1 /]# systemctl restart docker
修改cdh2中的docker配置并重啟
[root@cdh2 /]# vim /etc/docker/daemon.json # 添加以下兩行配置 "cluster-store": "consul://10.30.10.111:8500" "cluster-advertise": "10.30.10.112:2375" [root@cdh2 /]# systemctl restart docker
cluster-store指定的是consul服務(wù)地址,因為consul服務(wù)運行在cdh1的8500端口,所以?xún)膳_機器的cluster-store值均為consul://10.30.10.111:8500
cluster-advertise指定本機與consul的通信端口,所以指定為本機的2375端口
此時(shí)可以通過(guò)http://10.30.10.111:8500/訪(fǎng)問(wèn)consul地址
在Key/Value菜單中的docker-nodes目錄中可以看到cdh1和cdh2兩個(gè)docker節點(diǎn),代表consul配置成功。
此時(shí)我們可以創(chuàng )建overlay網(wǎng)絡(luò ),首先查看目前節點(diǎn)中已有的網(wǎng)絡(luò )類(lèi)型
[root@cdh1 /]# docker network ls NETWORK ID NAME DRIVER SCOPE ab0f335423a1 bridge bridge local b12e70a8c4e3 host host local 0dd357f3ecae none null local
然后在cdh1的docker節點(diǎn)創(chuàng )建overlay網(wǎng)絡(luò ),因為此時(shí)consul服務(wù)發(fā)現已經(jīng)正常運行,且cdh1和cdh2的docker服務(wù)已經(jīng)接入,所以此時(shí)overlay網(wǎng)絡(luò )是全局創(chuàng )建的,在任何一臺宿主機創(chuàng )建一次即可。
[root@cdh1 /]# docker network create -d overlay my_overlay cafa97c5cf9d30dd6cef08a5e9710074c828cea3fdd72edb45315fb4b1bfd84c [root@cdh1 /]# docker network ls NETWORK ID NAME DRIVER SCOPE ab0f335423a1 bridge bridge local b12e70a8c4e3 host host local cafa97c5cf9d my_overlay overlay global 0dd357f3ecae none null local
此時(shí)可以看到,創(chuàng )建的overlay網(wǎng)絡(luò ),標識為golbal。我們可以查看cdh2的網(wǎng)絡(luò ),可以發(fā)現overlay網(wǎng)絡(luò )也已經(jīng)創(chuàng )建完畢。
[root@cdh2 ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 90d99658ee8f bridge bridge local 19f844200737 host host local cafa97c5cf9d my_overlay overlay global 3986fe51b271 none null local
創(chuàng )建完成后,我們可以在cdh1和cdh2中指定overlay網(wǎng)絡(luò )創(chuàng )建docker容器,并進(jìn)行測試,查看是否可以跨宿主機通信。
在cdh1中創(chuàng )建名稱(chēng)為master的容器,并查看其IP
[root@cdh1 /]# docker run -itd -h master --name master --network my_overlay centos7_update /bin/bash [root@cdh1 /]# docker inspect -f "{{ .NetworkSettings.Networks.my_overlay.IPAddress}}" master 10.0.0.2
在cdh1中創(chuàng )建名稱(chēng)為slaver的容器,并查看其IP
[root@cdh2 ~]# docker run -itd -h slaver --name slaver --network my_overlay centos7_update /bin/bash [root@cdh2 ~]# docker inspect -f "{{ .NetworkSettings.Networks.my_overlay.IPAddress}}" slaver 10.0.0.3
此時(shí)進(jìn)入兩臺容器中,互相ping對方的IP,查看是否成功通信
[root@cdh1 ~]# docker exec -it master /bin/bash [root@master /]# ping 10.0.0.3 PING 10.0.0.3 (10.0.0.3) 56(84) bytes of data. 64 bytes from 10.0.0.3: icmp_seq=1 ttl=64 time=0.587 ms 64 bytes from 10.0.0.3: icmp_seq=2 ttl=64 time=0.511 ms 64 bytes from 10.0.0.3: icmp_seq=3 ttl=64 time=0.431 ms 64 bytes from 10.0.0.3: icmp_seq=4 ttl=64 time=0.551 ms 64 bytes from 10.0.0.3: icmp_seq=5 ttl=64 time=0.424 ms ^C --- 10.0.0.3 ping statistics --- 5 packets transmitted, 5 received, 0% packet loss, time 4000ms rtt min/avg/max/mdev = 0.424/0.500/0.587/0.070 ms
[root@cdh2 ~]# docker exec -it slaver /bin/bash [root@slaver /]# ping 10.0.0.2 PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data. 64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.499 ms 64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=0.500 ms 64 bytes from 10.0.0.2: icmp_seq=3 ttl=64 time=0.410 ms 64 bytes from 10.0.0.2: icmp_seq=4 ttl=64 time=0.370 ms ^C --- 10.0.0.2 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3000ms rtt min/avg/max/mdev = 0.370/0.444/0.500/0.062 ms
成功通信!
到此這篇關(guān)于docker容器間跨宿主機通信-基于overlay的實(shí)現方法的文章就介紹到這了,更多相關(guān)docker容器間跨宿主機通信內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站