一、概述

由于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. ES6基础入门之let、const

    作者 | Jeskson来源 | 达达前端小酒馆 01 首先呢?欢迎大家来学习ES6入门基础let,const的基础知识内容.初始ECMA Script6. ESMAScript与JavaScript ...

  2. 使用 gitstats 来统计代码

    使用 gitstats 来统计代码 github地址如下 gitstats clone地址 git clone https://github.com/hoxu/gitstats && ...

  3. oracle 根据身份证号计算出生日期

      1.情景展示 如何根据身份证号推算出出生日期? 2.解决方案 --根据身份证号计算出生日期 SELECT DECODE(LENGTH(ID_CARD), 18, SUBSTR(ID_CARD, 7 ...

  4. quartz 1.6.2之前的版本,定时任务自动停掉问题

    https://searchcode.com/codesearch/view/28831622/ Quartz 1.6.2 Release Notes This release contains a ...

  5. 深入SaltStack

    [译者注] 这是一篇发表在opencredo官网的博文,通过比较流行的Puppet和新发展起来的Salt,详细地介绍了Salt的功能.在征得原作者的同意后,翻译出来,与大家分享.初次翻译长文,请大家指 ...

  6. jQuery的zTree插件

    写在前面 jQuery的 zTree插件 关键代码 <%@ page language="java" contentType="text/html; charset ...

  7. ubuntu iptables重启生效:

    ubuntu iptables重启生效:save roles to a file:iptables-save >/etc/iptables.roles edit /etc/network/int ...

  8. WPF,回车即是tab

    正在做的WPF项目,客户需要在文本框里输入后按回车即跳到下一个框框,和tab一样的 上网搜索了下解决方案:如下: 在文本框外围 的grid加上KeyDown事件,代码里写上: /// <summ ...

  9. 浅入深出ETCD之【集群部署与golang客户端使用】

    前言 之前说了etcd的简介,命令行使用,一些基本原理.这次来说说现实一点的集群部署和golang版本的客户端使用.因为在实际使用过程中,etcd的节点肯定是需要2N+1个进行部署的,所以有必要说明一 ...

  10. 深入解读阿里云Redis开发规范

    Key命名设计:可读性.可管理性.简介性 规范建议使用冒号即:进行分割拼接,因为很多Redis客户端是根据冒号分类的.比如有几个Key:apps:app:1.apps:app:2和apps:app:3 ...