1. 测试环境

75机(10.11.150.75):Red Hat Enterprise Linux Server 7.0,无外网访问权限,已安装Docker Server

74机(10.11.150.74):Red Hat Enterprise Linux Server 7.0,无外网访问权限,已安装Docker Server

73机(10.11.150.73):Red Hat Enterprise Linux Server 7.0,无外网访问权限,已安装Docker Server

183机:OS X Yosemite 10.10.4,完全外网访问,用于下载安装包

2. 默认Docker网络情况

在73机和75机上通过下面命令启动docker服务:

sudo docker -d &

启动几个容器后,通过 brctl 工具和 ip a 查看网桥的配置情况,可以看到docker启动后默认创建了一个名为docker0的网桥,且分配了了172.17.42.1的内部IP:

可通过如下命令安装 brctl ,后面许多关于网桥的操作需要用到:

sudo yum install bridge-utils

在73机和75机之间的网络ping情况如下图所示,可以看出73机和75机容器之间的是不能ping通的:

下面将介绍利用Openvswitch对网络进行配置实现不同物理机间容器互连的方法。

3. 安装Openvswitch

以73机上的安装为例,先通过183机下载安装包并scp到73机上:

wget http://openvswitch.org/releases/openvswitch-2.3.0.tar.gz
scp openvswitch-2.3..tar.gz scs@10.11.150.73:/opt/scs/openxxs

在73机上安装必要的依赖环境,大部分依赖项Linux系统都自带了:

sudo yum -y install openssl-devel gcc make python-devel openssl-devel kernel-devel graphviz kernel-debug-devel autoconf automake rpm-build redhat-rpm-config libtool

创建系统用户ovs,并将安装包复制到ovs的主目录下:

sudo adduser ovs
sudo cp /opt/scs/openxxs/openvswitch-2.3..tar.gz /home/ovs/

切换至ovs用户,进行yum安装Openvswitch的必要准备,然后退回到原scs用户:

sudo su - ovs

tar -zxvpf openvswitch-2.3..tar.gz

mkdir -p ~/rpmbuild/SOURCES

sed 's/openvswitch-kmod, //g' openvswitch-2.3./rhel/openvswitch.spec > openvswitch-2.3./rhel/openvswitch_no_kmod.spec

cp openvswitch-2.3..tar.gz rpmbuild/SOURCES/

rpmbuild -bb --without check ~/openvswitch-2.3./rhel/openvswitch_no_kmod.spec

exit

安装Openvswitch:

sudo yum localinstall /home/ovs/rpmbuild/RPMS/x86_64/openvswitch-2.3.-.x86_64.rpm

安装完之后就可以启动openswitch服务了:

sudo mkdir /etc/openvswitch

setenforce 

sudo systemctl start openvswitch.service

sudo systemctl status openvswitch.service -l

以相同方式在74机上安装并启动Openvswitch。

4. 网桥配置

1)73机上配置:

首先开启ip_forward:

sudo sysctl -w net.ipv4.ip_forward=

然后通过ovs-vsctl创建ob0网桥并绑定IP:

sudo ovs-vsctl add-br ob0

sudo ovs-vsctl add-port ob0 gre0 -- set Interface gre0 type=gre options:remote_ip=10.11.150.73

通过brctl创建kbr0网桥和ob0关联,并删除docker0网桥的关联:

sudo brctl addbr kbr0

sudo brctl addif kbr0 ob0

sudo ip link set dev docker0 down

sudo ip link del dev docker0

创建 /etc/sysconfig/network-scripts/ifcfg-kbr0 文件,内容如下:

DEVICE=kbr0
ONBOOT=yes
BOOTPROTO=static
IPADDR=172.17.2.1
NETMASK=255.255.255.0
GATEWAY=172.17.2.0
USERCTL=no
TYPE=Bridge
IPV6INIT=no

创建 /etc/sysconfig/network-scripts/route-em1 文件(em1为实际网卡),内容如下:

172.17.1.0/ via 10.11.150.74 dev em1

配置完成后,重启网络服务:

sudo systemctl restart network.service

2)74机上配置:

与73机的配置类似,首先开启ip_forward:

sudo sysctl -w net.ipv4.ip_forward=1

然后通过ovs-vsctl创建obr0网桥并绑定IP:

sudo ovs-vsctl add-br obr0

sudo ovs-vsctl add-port obr0 gre0 -- set Interface gre0 type=gre options:remote_ip=10.11.150.74

通过brctl创建kbr0网桥和obr0关联,并删除docker0网桥的关联:

sudo brctl addbr kbr0

sudo brctl addif kbr0 obr0

sudo ip link set dev docker0 down

sudo ip link del dev docker0

创建 /etc/sysconfig/network-scripts/ifcfg-kbr0 文件,内容如下:

DEVICE=kbr0
ONBOOT=yes
BOOTPROTO=static
IPADDR=172.17.1.1
NETMASK=255.255.255.0
GATEWAY=172.17.1.0
USERCTL=no
TYPE=Bridge
IPV6INIT=no

创建 /etc/sysconfig/network-scripts/route-em1 文件(em1为实际网卡),内容如下:

172.17.2.0/24 via 10.11.150.73 dev em1

配置完成后,重启网络服务:

sudo systemctl restart network.service

5. 配置后网络情况

重启73机和74机的docker服务,启动时指定网桥为我们创建的kbr0:

sudo killall docker

sudo docker -d -b=kbr0 &

启动几个docker容器后我们可以查看两台机子的网络环境如下:

进行各个设备间的ping操作之后得出下图的网络情况,可以看到两个物理机下的容器间已经可以通过IP互联了:

6. 附

参考资料(外文,需FanQiang):https://n40lab.wordpress.com/2015/01/25/centos-7-installing-openvswitch-2-3-1-lts/

参考资料(中文):http://ylw6006.blog.51cto.com/470441/1606239/

openvswitch-2.3.0.tar.gz 百度云备份:http://pan.baidu.com/s/1c056wq0

利用Openvswitch实现不同物理机中的Docker容器互连的更多相关文章

  1. 教你如何修改运行中的docker容器的端口映射

    在docker run创建并运行容器的时候,可以通过-p指定端口映射规则.但是,我们经常会遇到刚开始忘记设置端口映射或者设置错了需要修改.当docker start运行容器后并没有提供一个-p选项或设 ...

  2. [转帖]教你如何修改运行中的docker容器的端口映射

    教你如何修改运行中的docker容器的端口映射   在docker run创建并运行容器的时候,可以通过-p指定端口映射规则.但是,我们经常会遇到刚开始忘记设置端口映射或者设置错了需要修改.当dock ...

  3. 如何修改运行中的docker容器的端口映射

    在docker run创建并运行容器的时候,可以通过-p指定端口映射规则.但是,我们经常会遇到刚开始忘记设置端口映射或者设置错了需要修改.当docker start运行容器后并没有提供一个-p选项或设 ...

  4. 如何修改运行中的docker容器的端口映射和挂载目录

    在docker run创建并运行容器的时候,可以通过-p指定端口映射规则.但是,我们经常会遇到刚开始忘记设置端口映射或者设置错了需要修改.当docker start运行容器后并没有提供一个-p选项或设 ...

  5. Ubuntu物理机中解决VirtualBox虚拟机无法连接USB设备的问题

    本文由荒原之梦原创,原文链接:http://zhaokaifeng.com/?p=611 问题描述: 在安装完VirtualBox的USB控制器扩展(关于在VirtualBox中安装USB控制器扩展的 ...

  6. 在Windows宿主机中连接虚拟机中的Docker容器

    1. 简单拓扑图

  7. 本机机器ssh docker容器

    https://blog.csdn.net/u010324465/article/details/77184506 1.在docker中安装openssh-server 2.sudo /etc/ini ...

  8. 从宿主机直接进入docker容器的网络空间

    Docker dns nameserver 也是进入容器网络空间,监听53端口,但它通过iptable把端口映射到宿主机上,处理DNS请求的进程就在宿主机上. how does Docker Embe ...

  9. 在airflow的BashOperator中执行docker容器中的脚本容易忽略的问题

    dag模板 from airflow import DAG from airflow.operators.bash_operator import BashOperator from airflow. ...

随机推荐

  1. 第三章 设计程序架构 之 设计实现Windows Azure 角色生命周期

    1. 概述 Windows Azure 是微软的云计算平台.用于 在微软数据中心 通过全局网络 生成.发布和管理应用程序. 本章内容包括 startup tasks 以及  实现 Start, Run ...

  2. 第四章 管理程序流(In .net4.5) 之 事件和回调

    1. 概述 本章讲解如何使用 委托.lambda表达式 和 匿名方法 来创建和使用事件. 2. 主要内容 2.1 理解委托 委托是一种用方法签名形式定义的类型.可以让它指向其他方法,可以通过它调用其他 ...

  3. Python核心编程--学习笔记--1--Python简介

    本章介绍了Python的背景知识,包括什么是Python.Python的起源以及Python的一些关键特性. 1 什么是Python Python是一门优雅而健壮的编程语言,它继承了传统编译语言的强大 ...

  4. VC下的人人对弈五子棋(dos)

    #include"stdio.h"#include"stdlib.h"#include"string.h"#include "io ...

  5. Oracle出现字符集问题处理方法

    1.  Cmd进去DOS 2.  再输入dbca(database  create) 3.  弹出的界面,直接下一步,选择删除数据库 4.  成功删除后,回到一第一界面,选择创建数据库,下一步. 5. ...

  6. ios各种手势,很有意思

    转自http://blog.csdn.net/likendsl/article/details/7554150 这哥们很厉害的 一.概述 iPhone中处理触摸屏的操作,在3.2之前是主要使用的是由U ...

  7. OC开发中运用到的枚举

      一  常见枚举的定义: typedef enum { LOGIN_SUCCESS, USER_NAME, USER_PASSWORD, OLD_LAT, OLD_LNG }FIELD_SAVED; ...

  8. Entity Framework学习笔记(三)----CRUD(2)

    请注明转载地址:http://www.cnblogs.com/arhat 昨天晚上老魏配的机器终于到了,可是拿回来之后什么都组装好了,唯独差一个非常重要的组件"电源线",老魏那个汗 ...

  9. homework-02 二维的,好喝的(二维数组的各种子数组)

    1)输入部分 对于输入部分,我定义的输入格式是这样的 前两行为列数和行数 如果文件无法打开,或者输入文件格式不对,均会提示出错并退出 2)二维数组的最大矩形子数组 首先,我使用最最简单的暴力算法,直接 ...

  10. Java内部实现的观察者模式小记

    假如Admin要观察User的工资变化,当User的工资增加或者减少时,都会引起Admin输出相应的信息. 定义观察者接口:MyObserver.java package cn.liuning.wat ...