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容器之间只能通过在主机上做端口映射进行通信.这种端口映射方式对很多集群应用来说极 ...
随机推荐
- 洛谷 P2815 IPv6地址压缩 题解
P2815 IPv6地址压缩 题目背景 (友情提示:IPv6基础知识曾多次出现在NOIP初赛中)Internet Protocol,互联网协议,即为我们常说的IP.我们目前常说的IP主要指它的第四版, ...
- windows内核代码之进程操作
[toc] 一丶简介 整理一下windows内核中.常用的代码.这里只整理下进程的相关代码. 二丶 windows内核之遍历进程 内核中记录进程的结构体是EPROCESS结构.所以只需要遍历这个结构即 ...
- 系统权限远程线程注入到Explorer.exe
目录 提升为系统权限,注入到explorer中 一丶简介 二丶注入效果图 提升为系统权限,注入到explorer中 一丶简介 我们上一面说了系统服务拥有系统权限.并且拥有system权限.还尝试启动了 ...
- SSH登录慢解方案 - 关闭UseDNS加速
每次登录SSH时总是要停顿等待一会儿才能连接上,,这是因为OpenSSH服务器有一个DNS查找选项UseDNS默认情况下是打开的. UseDNS 选项打开状态下,当通过终端登录SSH服务器时,服务器端 ...
- ex3
#include <stdio.h> int main() { char ch; printf("please input:\n"); scanf("%c&q ...
- Internet地址结构
IP地址结构及分类寻址 IP地址 = <网络号> + <主机号> ------------IPv4(32bit)点分四组表示法: 192.168.31.1 ...
- 微信token介绍
这里的微信token 有以下三种 1.小程序的token (appid+appsecret=token) 2.一个是第三方平台token(comment_appid+comment_appsecre ...
- TermKit的新一代Mac终端,在Ubuntu 11.04 轻松安装TermKit
作为开发人员的必备工具,终端程序却一直没有什么大的变化,TermKit旨在改变这一切,作为下一代的命令行/终端程序,TermKit为我们提供了一个图形化的终端/命令行程序,它可以以可视化的方式展示终端 ...
- Go安装配置和《菜鸟教程之Go语言教程》学习笔记
Go 语言是一种让代码分享更容易的编程语言 菜鸟教程-Go语言教程(这个教程过于基础,体现不了Go的特性和强大.) 下载/安装Go语言 https://golang.org/dl/ Mac OS X ...
- ps 渐进式图片的技巧(支持jpg,gif,png)
https://www.zhangxinxu.com/wordpress/2013/01/progressive-jpeg-image-and-so-on/ CTRL + SHIFT + ALT + ...