一、概述

由于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的更多相关文章

  1. Docker容器跨主机通信

    默认情况下Docker容器需要跨主机通信两个主机节点都需要在同一个网段下,这时只要两个Docker容器的宿主机能相互通信并且该容器使用net网络模式,改实现方式为网桥模式通信: 除此之外我们还可以通过 ...

  2. Docker容器跨主机通信之:直接路由方式

    一.Docker网络基本原理 直观上看,要实现网络通信,机器需要至少一个网络接口(物理接口或虚拟接口)与外界相通,并可以收发数据包:此外,如果不同子网之间要进行通信,需要额外的路由机制. Docker ...

  3. Docker容器跨主机通信--overlay网络

    一.Docker主机间容器通信的解决方案 Docker网络驱动 Overlay: 基于VXLAN封装实现Docker原生Overlay网络 Macvlan: Docker主机网卡接口逻辑上分为多个子接 ...

  4. overlay实现容器跨主机通信

    本节内容: Docker容器跨主机通信方案 环境信息 升级内核 安装docker 防火墙设置和开启内核转发 安装启动consul 启动Docker 创建overlay network 创建容器 测试容 ...

  5. Docker 网络管理及容器跨主机通信

    1.网络模式 docker支持四种网络模式,使用--net选项指定: host,--net=host,如果指定此模式,容器将不会获得一个独立的network namespace,而是和宿主机共用一个. ...

  6. 【06】循序渐进学 docker:跨主机通信

    写在前面的话 目前解决容器跨主机通信的方案有很多种,这里给出的只是其中的一种,而且还不是最好的方案,不过归根结底,大同小异.在学习 docker swarm 之前,大家可以先看看这种. 啥是 over ...

  7. Docker:跨主机通信

    修改主机docker默认的虚拟网段,然后在各自主机上分别把对方的docker网段加入到路由表中,配合iptables即可实现docker容器夸主机通信.配置方法如下: 设有三台虚拟机 v1: 10.1 ...

  8. Docker:macvlan实现容器跨主机通信 [十四]

    一.什么是macvlan 1.macvlan 本身是 linux kernel 模块,其功能是允许在同一个物理网卡上配置多个 MAC 地址, 2.即多个 interface,每个 interface ...

  9. Docker-Docker容器跨主机通信

    Docker默认的网络环境下,单台主机上的Docker容器可以通过docker0网桥直接通信,而不同主机上的Docker容器之间只能通过在主机上做端口映射进行通信.这种端口映射方式对很多集群应用来说极 ...

随机推荐

  1. 闹钟--alarmManager

    1.AlarmManager,顾名思义,就是“提醒”,是Android中 常用的一种系统级别的提示服务,在特定的时刻为我们广播一个指定的Intent.简单的说就是我们设定一个时间,然后在该时间到来 时 ...

  2. cocos2dx实现功能强大的RichText控件

    转自:http://blog.csdn.net/ljxfblog/article/details/26136773 最近准备做一个聊天系统,开始准备使用cocos2dx的UIRichText控件来显示 ...

  3. Linux课本第一二章

    一.第一章:Linux内核简介 1.操作系统和内核:操作系统是指在整个系统中负责完成最基本功能和系统管理的那些部分,包括内核.设备驱动程序.启动引导程序.命令行shall等. 内核就是操作系统的核心, ...

  4. 例3-12opencv设置ROI感兴趣区域

    前面说了一堆,也不知道啥用,感觉也没说清楚,可能确实需要一些例子来显性表示一下,或者他们在当初出版书籍针对的人群已经有了对图像的基本认识,然而自己还是没有建立起来,往后看看吧,希望能比较清楚的自己处理 ...

  5. Java基础知识强化之集合框架笔记71:模拟斗地主洗牌和发牌并对牌进行排序的案例

    1. 模拟斗地主洗牌和发牌并对牌进行排序的原理图解: 2. 代码实现: 思路: • 创建一个HashMap集合 • 创建一个ArrayList集合 • 创建花色数组和点数数组 • 从0开始往HashM ...

  6. 整整68页学习C++的文章

    有空看看,有不少好东西: http://dev.21tx.com/language/c/index.shtml

  7. 为Firefox 添加自定义搜索引擎

    网上流传的 about:config[对于新版已经失效] 以及到Firefox安装目录中修改 的方式不知道为什么我没有成功 现在来个简单点得! 首先我们需要一个可以自定义搜索引擎的插件 Organiz ...

  8. 自学Zabbix3.3-一个简单例子 添加Hosts并应用模板

    Host 是 Zabbix 监控的基本载体,所有的监控项都是基于 host 的. 通过 Configuration->Hosts->Create Host 来创建监控设备 按提示填入 Na ...

  9. [poj1185]炮兵阵地_状压dp

    炮兵阵地 poj-1185 题目大意:给出n列m行,在其中添加炮兵,问最多能加的炮兵数. 注释:n<=100,m<=10.然后只能在平原的地方建立炮兵. 想法:第2到状压dp,++.这题显 ...

  10. 【dotNet Core】Swagger下简单的给WebApi分组

    Startup.cs下ConfigureServices代码 这里主要在DocInclusionPredicate控制输出那些api. Startup.cs下Configure代码 给Controll ...