Docker容器跨主機通信之:OVS+GRE
- 2020 年 3 月 5 日
- 筆記
一、概述
由於docker自身還未支持跨主機容器通信,需要藉助docker網絡開源解決方案
OVS
OpenVSwich即開放式虛擬交換機實現,簡稱OVS,OVS在雲計算領域應用廣泛,值得我們去學習使用。
OpenVSwich
OpenVSwich是一種開源軟件,通過軟件的方式實現二層交換機功能,專門管理多租賃雲計算網絡環境,提供虛擬網絡中的訪問策略、網絡隔離、流量監控等。
既然是虛擬交換機,自然與傳統的物理交換機有着相同的特性,操作中可以按照理解物理交換機的方式去操作,有助於對虛擬交換機的認識。
GRE隧道
GRE即通用路由協議封裝,隧道技術是一種封裝技術,將網絡層協議(如IP)的數據報文進行封裝,使這些封裝的數據報文能夠在另一個網絡層協議中傳輸。可以看作是一個虛擬點到點連接,所以建立隧道時,要配置好隧道源地址和目的地址。
二、基於OVS+GRE的大二層通信
實驗環境
操作系統 |
主機 |
主機ip |
容器網段 |
---|---|---|---|
ubuntu-16.04.4-server-amd64 |
主機1 |
172.31.15.168 |
172.17.43.1/24 |
ubuntu-16.04.4-server-amd64 |
主機2 |
172.31.4.143 |
172.17.42.1/24 |
示意圖

修改Docker0的網絡地址
編輯主機1上的 /etc/docker/daemon.json 文件,添加內容:
{ "bip": "172.17.43.1/24" }
編輯主機2上的 /etc/docker/daemon.json 文件,添加內容:
{ "bip":"172.17.42.1/24" }
重啟docker服務
主機1和主機2上均執行如下命令重啟docker服務以使修改後的docker0網段生效
systemctl restart docker
創建ovs bridge
主機1和主機2 操作:
安裝 openvswitch
apt install -y openvswitch-switch
創建bro網橋
ovs-vsctl add-br br0
查看bro網橋

root@ubuntu:~# ifconfig br0 br0 Link encap:以太網 硬件地址 1e:cc:2c:52:13:42 BROADCAST MULTICAST MTU:1500 躍點數:1 接收數據包:0 錯誤:0 丟棄:0 過載:0 幀數:0 發送數據包:0 錯誤:0 丟棄:0 過載:0 載波:0 碰撞:0 發送隊列長度:1 接收位元組:0 (0.0 B) 發送位元組:0 (0.0 B)

設置gre端口
將gre0接口加入到網橋obr0, 遠程IP寫對端IP(創建一個GRE隧道並添加到網橋中)
主機1 執行:
ovs-vsctl add-port br0 gre0 -- set Interface gre0 type=gre option:remote_ip=172.31.4.143
注意:172.31.4.143 是主機2的ip地址。
主機2 執行:
ovs-vsctl add-port br0 gre0 -- set Interface gre0 type=gre option:remote_ip=172.31.15.168
注意:172.31.15.168 是主機1的ip地址。
主機1和主機2 操作:
# 將br0網橋加入docker0網橋 brctl addif docker0 br0 # 啟動br0網橋 ip link set dev br0 up # 啟動docker0網橋 ip link set dev docker0 up # 添加路由條目 ip route add 172.17.0.0/16 dev docker0
注意:由於主機1和主機2的網絡掩碼為24,因此16位就可以包含這2個網絡了。
查看網橋信息
root@ubuntu:~# brctl show bridge name bridge id STP enabled interfaces docker0 8000.0242f148614e no br0
啟動容器測試
主機1和主機2 操作:
docker run -itd --name test busybox /bin/sh
查看容器信息
主機1 執行:
docker inspect test
輸出:

... "Gateway": "172.17.43.1", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAddress": "172.17.43.2", ...

ping 主機2的docker ip

root@ubuntu:~# ping 172.17.42.2 -c 2PING 172.17.42.2 (172.17.42.2) 56(84) bytes of data.64 bytes from 172.17.42.2: icmp_seq=1 ttl=63 time=0.505 ms64 bytes from 172.17.42.2: icmp_seq=2 ttl=63 time=0.858 ms--- 172.17.42.2 ping statistics ---2 packets transmitted, 2 received, 0% packet loss, time 1000ms rtt min/avg/max/mdev = 0.505/0.681/0.858/0.178 ms

主機2 執行:
ping 主機1的docker ip

root@ubuntu:~# ping 172.17.43.2 -c 2PING 172.17.43.2 (172.17.43.2) 56(84) bytes of data.64 bytes from 172.17.43.2: icmp_seq=1 ttl=63 time=1.90 ms64 bytes from 172.17.43.2: icmp_seq=2 ttl=63 time=0.641 ms--- 172.17.43.2 ping statistics ---2 packets transmitted, 2 received, 0% packet loss, time 1002ms rtt min/avg/max/mdev = 0.641/1.274/1.907/0.633 ms

本文參考鏈接:
https://blog.csdn.net/xialingming/article/details/83093031