日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Docker跨主機通信實現(xiàn)與分析

前言

河東ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!

docker目前支持以下5種網(wǎng)絡模式:

  • bridge:此時docker引擎會創(chuàng)建一個veth對,一端連接到容器實例并命名為eth0,另一端連接到指定的網(wǎng)橋中(比如docker0),因此同在一個主機的容器實例由于連接在同一個網(wǎng)橋中,它們能夠互相通信。容器創(chuàng)建時還會自動創(chuàng)建一條SNAT規(guī)則,用于容器與外部通信時。如果用戶使用了-p或者-Pe端口端口,還會創(chuàng)建對應的端口映射規(guī)則。
  • host:與宿主機共享網(wǎng)絡,此時容器沒有使用網(wǎng)絡的namespace,宿主機的所有設備,如Dbus會暴露到容器中,因此存在安全隱患。
  • none:不設置網(wǎng)絡,相當于容器內(nèi)沒有配置網(wǎng)卡,用戶可以手動配置。
  • container:指定與某個容器實例共享網(wǎng)絡
  • network:使用自定義網(wǎng)絡,可以使用docker network create創(chuàng)建,并且默認支持多種網(wǎng)絡驅(qū)動,用戶可以自由創(chuàng)建橋接網(wǎng)絡或者overlay網(wǎng)絡。

默認是橋接模式,網(wǎng)絡地址為172.16.0.0/16,同一主機的容器實例能夠通信,但不能跨主機通信。本文下面將介紹如何使用gre隧道技術(shù)實現(xiàn)跨主機通信。

環(huán)境配置

本文使用兩臺主機A,B模擬實驗,這兩臺主機其實是virtalbox虛擬機,操作系統(tǒng)為ubuntu14.04,均配置有兩張網(wǎng)卡,網(wǎng)卡配置如下:

  • eth0:與宿主機橋接,連接公網(wǎng)
  • eth1:host only網(wǎng)卡,分配的ip地址為192.168.56.0/24,連接在同一個host only的網(wǎng)卡能夠互相通信

其中A主機網(wǎng)絡:

 
 
 
  1. eth0: 172.16.1.24(公司內(nèi)網(wǎng)IP,能夠通外網(wǎng)) 
  2. eth1: 192.168.56.4 

B主機網(wǎng)絡:

 
 
 
  1. eth0: 172.16.1.178(公司內(nèi)網(wǎng)IP,能夠通外網(wǎng))  
  2. eth1: 192.168.56.5 

兩臺主機需要安裝以下軟件包:

  • Docker,實驗時使用的***版本1.11,快速安裝:
 
 
 
  1. curl -sSL https://get.docker.com/ | sh 
  • Openvswitch, 安裝方法:
 
 
 
  1. sudo apt-get install openvswitch-switch 
  • bridge-utils,也可以不安裝,使用ovs-vsctl。

Docker配置

兩臺主機的容器能夠通信,不能出現(xiàn)網(wǎng)絡重疊,因此設置不同的網(wǎng)絡:

 
 
 
  1. A: 10.103.100.0/24  
  2. B: 10.103.200.0/24 

并且為了加速鏡像拉取,使用靈雀云鏡像。***A主機配置文件/etc/default/docker如下:

 
 
 
  1. DOCKER_OPTS="$DOCKER_OPTS --registry-mirror=http://houchaohann.m.alauda.cn --bip=10.103.100.1/24 --fixed-cidr=10.103.100.0/24" 

B主機配置文件/etc/default/docker如下:

 
 
 
  1. DOCKER_OPTS="$DOCKER_OPTS --registry-mirror=http://houchaohann.m.alauda.cn --bip=10.103.200.1/24 --fixed-cidr=10.103.200.0/24" 

分別重啟A、B主機Docker服務:

 
 
 
  1. sudo service docker restart 

此時A主機docker0網(wǎng)橋地址為10.103.100.1,B主機docker0網(wǎng)橋地址為10.103.200.1。

在A主機上ping 10.103.200.1顯然不通,同理B主機ping不通A主機網(wǎng)橋。

隧道配置

在A主機上創(chuàng)建一個網(wǎng)橋(使用ovs-vsctl,不要使用brctl):

 
 
 
  1. sudo ovs-vsctl add-br docker_tunnel 

將gre0接口加入到網(wǎng)橋docker_tunnel, 創(chuàng)建一個GRE隧道添加到網(wǎng)橋中并配置遠端IP,注意:我們在eth1之上建立隧道,因此需要使用eth1 IP地址:

 
 
 
  1. sudo ovs-vsctl add-port docker_tunnel gre0 -- set Interface gre0 type=gre options:remote_ip=192.168.56.5 

此時:

 
 
 
  1. fgp@ubuntu-4:~$ sudo ovs-vsctl show 
  2. 2189345f-d4fb-4915-ab97-4c65a8d9ffe0 
  3.     Bridge docker_tunnel 
  4.         Port "gre0" 
  5.             Interface "gre0" 
  6.                 type: gre 
  7.                 options: {remote_ip="192.168.56.5"} 
  8.         Port docker_tunnel 
  9.             Interface docker_tunnel 
  10.                 type: internal 
  11.     ovs_version: "2.0.2" 

把docker_tunnel加入到docker0網(wǎng)橋中:

 
 
 
  1. sudo brctl addif docker0 docker_tunnel 

增加路由:

 
 
 
  1. sudo ip route add 10.103.200.0/24 via 192.168.56.5 dev eth1 

此時路由表:

 
 
 
  1. fgp@ubuntu-4:~$ sudo route -n 
  2. Kernel IP routing table 
  3. Destination     Gateway         Genmask         Flags Metric Ref    Use Iface 
  4. 0.0.0.0         172.16.1.1      0.0.0.0         UG    0      0        0 eth0 
  5. 10.103.100.0    0.0.0.0         255.255.255.0   U     0      0        0 docker0 
  6. 10.103.200.0    192.168.56.5    255.255.255.0   UG    0      0        0 eth1 
  7. 172.16.1.0      0.0.0.0         255.255.255.0   U     0      0        0 eth0 
  8. 192.168.56.0    0.0.0.0         255.255.255.0   U     0      0        0 eth1 

驗證A主機是否能和B通信:

 
 
 
  1. fgp@ubuntu-4:~$ ping -c 2 -w 1 10.103.200.1 
  2. PING 10.103.200.1 (10.103.200.1) 56(84) bytes of data. 
  3. 64 bytes from 10.103.200.1: icmp_seq=1 ttl=64 time=0.339 ms 
  4.  
  5. --- 10.103.200.1 ping statistics --- 
  6. 1 packets transmitted, 1 received, 0% packet loss, time 0ms 
  7. rtt min/avg/max/mdev = 0.339/0.339/0.339/0.000 ms 

同樣在B主機執(zhí)行相同步驟:

 
 
 
  1. sudo ovs-vsctl add-br docker_tunnel 
  2. sudo ovs-vsctl add-port docker_tunnel gre0 -- set Interface gre0 type=gre options:remote_ip=192.168.56.4 
  3. sudo brctl addif docker0 docker_tunnel 
  4. sudo ip route add 10.103.100.0/24 via 192.168.56.4 dev eth1 

驗證B主機是否能夠和A通信:

 
 
 
  1. fgp@ubuntu-5:~$ ping -c 2 -w 1 10.103.100.1 
  2. PING 10.103.100.1 (10.103.100.1) 56(84) bytes of data. 
  3. 64 bytes from 10.103.100.1: icmp_seq=1 ttl=64 time=0.336 ms 
  4. 64 bytes from 10.103.100.1: icmp_seq=2 ttl=64 time=0.409 ms 
  5.  
  6. --- 10.103.100.1 ping statistics --- 
  7. 2 packets transmitted, 2 received, 0% packet loss, time 999ms 
  8. rtt min/avg/max/mdev = 0.336/0.372/0.409/0.041 ms 

驗證docker容器跨主機通信

A主機創(chuàng)建ubuntu14.04容器:

 
 
 
  1. docker run -t -i --rm --name from-A --hostname from-A ubuntu:14.04 bash 

在容器內(nèi)部查看ip地址:

 
 
 
  1. # from-A 
  2. ifconfig eth0 | grep 'inet addr' | cut -d ':' -f 2 | cut -d ' ' -f 1 
  3. # 10.103.100.2 

B主機創(chuàng)建ubuntu14.04容器:

 
 
 
  1. docker run -t -i --rm --name from-A --hostname from-B ubuntu:14.04 bash 

在容器內(nèi)部查看地址:

 
 
 
  1. # from-B 
  2. ifconfig eth0 | grep 'inet addr' | cut -d ':' -f 2 | cut -d ' ' -f 1 
  3. # 10.103.200.2 

在A容器實例上ping B容器實例:

 
 
 
  1. # from-A 
  2. ping 10.103.200.2 

輸出:

 
 
 
  1. root@from-A:/# ping -c 2 -w 1 10.103.200.2 
  2. PING 10.103.200.2 (10.103.200.2) 56(84) bytes of data. 
  3. 64 bytes from 10.103.200.2: icmp_seq=1 ttl=62 time=0.510 ms 
  4.  
  5. --- 10.103.200.2 ping statistics --- 
  6. 1 packets transmitted, 1 received, 0% packet loss, time 0ms 
  7. rtt min/avg/max/mdev = 0.510/0.510/0.510/0.000 ms 

我們發(fā)現(xiàn),在主機A的容器成功ping通主機B的容器,實現(xiàn)了跨主機通信!

使用docker-swarm實現(xiàn)跨主機容器通信

docker的overlay的網(wǎng)絡驅(qū)動支持跨主機通信,這個實現(xiàn)在libnetwork中基于內(nèi)置的VXLAN實現(xiàn)以及docker的libkv庫。使用overlay網(wǎng)絡需要依賴K-V Store,目前支持的K-V Store包括etcd、Consul、Zookeeper。

本來想直接使用docker啟動consul的,后來發(fā)現(xiàn)docker daemon啟動依賴consul,因此只能先按照consul。首先到官方下載安裝包:下載地址,解壓縮后,只有一個二進制文件,直接運行即可:

 
 
 
  1. nohup ./consul agent -dev -advertise 172.16.1.24 -client 0.0.0.0 & 

注意: 該服務在A機器上運行,172.16.1.24務必配成能夠連接外網(wǎng)的IP地址,否則后面啟動Swarm容器時內(nèi)部無法通信!

然后修改A、B服務的daemon配置文件/etc/default/docker:

 
 
 
  1. DOCKER_OPTS="--cluster-store=consul://172.16.1.24:8500 --cluster-advertise=eth0:2375" 
  2. DOCKER_OPTS="$DOCKER_OPTS --registry-mirror=http://houchaohann.m.alauda.cn -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock" 

重啟docker服務:

 
 
 
  1. sudo service docker restart 

執(zhí)行docker info必須包含以下信息:

 
 
 
  1. Cluster store: consul://172.16.1.24:8500 
  2. Cluster advertise: 172.16.1.24:2375 

接著我們需要部署Docker Swarm集群,詳細過程參考手動部署docker-swarm集群。

***創(chuàng)建overlay網(wǎng)絡:

 
 
 
  1. docker network create --driver overlay --subnet 10.103.240.0/24 test 

其中--dirver指定為overlay,并指定我們需要的子網(wǎng)地址,名稱為test,通過docker network ls可以檢查我們創(chuàng)建的網(wǎng)絡是否成功:

 
 
 
  1. fgp@ubuntu-5:~$ docker network ls | grep test 
  2. 7eef808f272b        test                       overlay 

此時overlay網(wǎng)絡創(chuàng)建完畢。我們測試其是否支持跨主機通信,首先我們創(chuàng)建一個ubuntu容器,命名為ubuntu-1,并使用我們剛剛創(chuàng)建的網(wǎng)絡:

 
 
 
  1. docker run -t -i -d --net test --name ubuntu-1 ubuntu:14.04 

接著我們創(chuàng)建***個ubuntu容器,此時為了保證它不和ubuntu-1調(diào)度在同一臺主機上,我們需要使用docker swarm的filter,指定affinity,如下:

 
 
 
  1. docker run -t -i -d --net test --name ubuntu-2 -e affinity:container!=~ubuntu-1 ubuntu:14.04 

運行docker ps:

 
 
 
  1. docker ps 
  2. fgp@ubuntu-5:~$ docker ps 
  3. CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                  PORTS               NAMES 
  4. ba5018dfe26e        ubuntu:14.04        "/bin/bash"         2 minutes ago       Up Less than a second                       ubuntu-5/ubuntu-1 
  5. bedd266cddaa        ubuntu:14.04        "/bin/bash"         14 hours ago        Up 41 seconds                               ubuntu-4/ubuntu-2 

由此可知,兩個ubuntu容器運行在不同的主機上,符合我們的測試要求。分別獲取ubuntu-1和ubuntu-2的ip地址:

 
 
 
  1. fgp@ubuntu-5:~$ docker inspect -f '' ubuntu-1 
  2. 10.103.240.2 
  3. fgp@ubuntu-5:~$ docker inspect -f '' ubuntu-2 
  4. 10.103.240.3 

可見ubuntu-1的ip地址為10.103.240.2,ubuntu-2的ip地址為10.103.240.3,我們在ubuntu-1上ping ubuntu-2地址:

 
 
 
  1. fgp@ubuntu-5:~$ docker exec -t -i ubuntu-1 ping -c 2 10.103.240.3 
  2. PING 10.103.240.3 (10.103.240.3) 56(84) bytes of data. 
  3. 64 bytes from 10.103.240.3: icmp_seq=1 ttl=64 time=0.559 ms 
  4. 64 bytes from 10.103.240.3: icmp_seq=2 ttl=64 time=0.661 ms 
  5.  
  6. --- 10.103.240.3 ping statistics --- 
  7. 2 packets transmitted, 2 received, 0% packet loss, time 999ms 
  8. rtt min/avg/max/mdev = 0.559/0.610/0.661/0.051 ms 

結(jié)果發(fā)現(xiàn),不在同一主機的ubuntu-1和ubuntu-2能夠正常通信!

【本文是專欄作者“付廣平”的原創(chuàng)文章,如需轉(zhuǎn)載請通過獲得聯(lián)系】

戳這里,看該作者更多好文


網(wǎng)頁名稱:Docker跨主機通信實現(xiàn)與分析
本文網(wǎng)址:http://www.5511xx.com/article/dpsiheg.html