Docker容器跨主机通信之:OVS+GRE
一、概述
由于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:::
BROADCAST MULTICAST MTU: 跃点数:
接收数据包: 错误: 丢弃: 过载: 帧数:
发送数据包: 错误: 丢弃: 过载: 载波:
碰撞: 发送队列长度:
接收字节: (0.0 B) 发送字节: (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 .0242f148614e no br0
启动容器测试
主机1和主机2 操作:
docker run -itd --name test busybox /bin/sh
查看容器信息
主机1 执行:
docker inspect test
输出:
...
"Gateway": "172.17.43.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": ,
"IPAddress": "172.17.43.2",
...
ping 主机2的docker ip
root@ubuntu:~# ping 172.17.42.2 -c 2
PING 172.17.42.2 (172.17.42.2) () bytes of data.
bytes from 172.17.42.2: icmp_seq= ttl= time=0.505 ms
bytes from 172.17.42.2: icmp_seq= ttl= time=0.858 ms --- 172.17.42.2 ping statistics ---
packets transmitted, received, % 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 2
PING 172.17.43.2 (172.17.43.2) () bytes of data.
bytes from 172.17.43.2: icmp_seq= ttl= time=1.90 ms
bytes from 172.17.43.2: icmp_seq= ttl= time=0.641 ms --- 172.17.43.2 ping statistics ---
packets transmitted, received, % 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
Docker容器跨主机通信之:OVS+GRE的更多相关文章
- Docker容器跨主机通信
默认情况下Docker容器需要跨主机通信两个主机节点都需要在同一个网段下,这时只要两个Docker容器的宿主机能相互通信并且该容器使用net网络模式,改实现方式为网桥模式通信: 除此之外我们还可以通过 ...
- Docker容器跨主机通信之:直接路由方式
一.Docker网络基本原理 直观上看,要实现网络通信,机器需要至少一个网络接口(物理接口或虚拟接口)与外界相通,并可以收发数据包:此外,如果不同子网之间要进行通信,需要额外的路由机制. Docker ...
- Docker容器跨主机通信--overlay网络
一.Docker主机间容器通信的解决方案 Docker网络驱动 Overlay: 基于VXLAN封装实现Docker原生Overlay网络 Macvlan: Docker主机网卡接口逻辑上分为多个子接 ...
- overlay实现容器跨主机通信
本节内容: Docker容器跨主机通信方案 环境信息 升级内核 安装docker 防火墙设置和开启内核转发 安装启动consul 启动Docker 创建overlay network 创建容器 测试容 ...
- Docker 网络管理及容器跨主机通信
1.网络模式 docker支持四种网络模式,使用--net选项指定: host,--net=host,如果指定此模式,容器将不会获得一个独立的network namespace,而是和宿主机共用一个. ...
- 【06】循序渐进学 docker:跨主机通信
写在前面的话 目前解决容器跨主机通信的方案有很多种,这里给出的只是其中的一种,而且还不是最好的方案,不过归根结底,大同小异.在学习 docker swarm 之前,大家可以先看看这种. 啥是 over ...
- Docker:跨主机通信
修改主机docker默认的虚拟网段,然后在各自主机上分别把对方的docker网段加入到路由表中,配合iptables即可实现docker容器夸主机通信.配置方法如下: 设有三台虚拟机 v1: 10.1 ...
- Docker:macvlan实现容器跨主机通信 [十四]
一.什么是macvlan 1.macvlan 本身是 linux kernel 模块,其功能是允许在同一个物理网卡上配置多个 MAC 地址, 2.即多个 interface,每个 interface ...
- Docker-Docker容器跨主机通信
Docker默认的网络环境下,单台主机上的Docker容器可以通过docker0网桥直接通信,而不同主机上的Docker容器之间只能通过在主机上做端口映射进行通信.这种端口映射方式对很多集群应用来说极 ...
随机推荐
- ES6基础入门之let、const
作者 | Jeskson来源 | 达达前端小酒馆 01 首先呢?欢迎大家来学习ES6入门基础let,const的基础知识内容.初始ECMA Script6. ESMAScript与JavaScript ...
- 使用 gitstats 来统计代码
使用 gitstats 来统计代码 github地址如下 gitstats clone地址 git clone https://github.com/hoxu/gitstats && ...
- oracle 根据身份证号计算出生日期
1.情景展示 如何根据身份证号推算出出生日期? 2.解决方案 --根据身份证号计算出生日期 SELECT DECODE(LENGTH(ID_CARD), 18, SUBSTR(ID_CARD, 7 ...
- quartz 1.6.2之前的版本,定时任务自动停掉问题
https://searchcode.com/codesearch/view/28831622/ Quartz 1.6.2 Release Notes This release contains a ...
- 深入SaltStack
[译者注] 这是一篇发表在opencredo官网的博文,通过比较流行的Puppet和新发展起来的Salt,详细地介绍了Salt的功能.在征得原作者的同意后,翻译出来,与大家分享.初次翻译长文,请大家指 ...
- jQuery的zTree插件
写在前面 jQuery的 zTree插件 关键代码 <%@ page language="java" contentType="text/html; charset ...
- ubuntu iptables重启生效:
ubuntu iptables重启生效:save roles to a file:iptables-save >/etc/iptables.roles edit /etc/network/int ...
- WPF,回车即是tab
正在做的WPF项目,客户需要在文本框里输入后按回车即跳到下一个框框,和tab一样的 上网搜索了下解决方案:如下: 在文本框外围 的grid加上KeyDown事件,代码里写上: /// <summ ...
- 浅入深出ETCD之【集群部署与golang客户端使用】
前言 之前说了etcd的简介,命令行使用,一些基本原理.这次来说说现实一点的集群部署和golang版本的客户端使用.因为在实际使用过程中,etcd的节点肯定是需要2N+1个进行部署的,所以有必要说明一 ...
- 深入解读阿里云Redis开发规范
Key命名设计:可读性.可管理性.简介性 规范建议使用冒号即:进行分割拼接,因为很多Redis客户端是根据冒号分类的.比如有几个Key:apps:app:1.apps:app:2和apps:app:3 ...