主要用到openvswitch和netns网络名称空间的相关知识还有ip命令的使用。

实验环境的结构图如下:

思路如下:

  1. 安装openvswitch
  2. ovs创建br0,br1,并启动两个不加载网络的docker容器
  3. 将容器关联网桥br0,并设置ip、vlan
  4. 创建veth0与veth1网卡对
  5. 创建netns名称空间,并添加veth0.0和veth1.0接口,并配置相关信息
  6. 将veth0.1和veth1.1分别桥接至br0,br1,并配置相关信息
  7. 添加SNAT和DNAT规则
  8. 给br1配置ip测试连通

具体步骤如下

1.安装openvswitch

# yum install -y openvswitch

下载OpenvSwitch项目提供的支持Docker容器的辅助脚本ovs-docker:

# wget https://github.com/openvswitch/ovs/raw/master/utilities/ovs-docker

# chmod a+x ovs-docker

此处脚本最好放在/root目录下,后续使用ovs-docker命令需要用到

2.ovs创建br0,br1,并启动两个不加载网络的docker容器

# ovs-vsctl add-br br0

# ovs-vsctl add-br br0

# ip link set br0 up

# ip link set br1 up

# docker run –it –privileged=true –net=none –name box1 busybox:latest /bin/sh

# docker run –it –privileged=true –net=none –name box2 busybox:latest /bin/sh

通过ctrl p+ctrl q可以退出容器并且不关闭容器

3.将容器关联网桥br0,并设置ip、vlan

# ./ovs-docker add-port br0 eth0 box1 –ipaddress=10.0.0.1/24 –gateway=10.0.0.253

# ./ovs-docker set-vlan br0 eth0 box1 5

# ./ovs-docker add-port br0 eth0 box2 –ipaddress=10.0.0.2/24 –gateway=10.0.0.253

# ./ovs-docker set-vlan br0 eth0 box2 5

此时可以先测试容器的互通性,两容器相互ping测试。

4.创建veth0与veth1网卡对

# ip link add veth0.0 type veth peer name veth0.1

# ip link add veth1.0 type veth peer name veth1.1

注意开启:net.ipv4.ip_forward=1

5.创建netns名称空间,并添加veth0.0和veth1.0接口,并配置相关信息

# ip netns add r1               创建netns名称空间r1

# ip link set veth0.0 netns r1          添加两个接口

# ip link set veth1.0 netns r1

# ip netns exec r1 ip link set veth0.0 up   启动两个接口

# ip netns exec r1 ip link set veth1.0 up

# ip netns exec r1 ip addr add 192.168.2.221/24 dev veth1.0        给veth1.0添加ip

# ip netns exec r1 ifconfig veth1.0:1 192.168.1.223/24 up        配置两个浮动ip

# ip netns exec r1 ifconfig veth1.0:2 192.168.1.224/24 up

# ip netns exec r1 ip addr add 10.0.0.253/24 dev veth0.1        配置容器的网关地址

6.将veth0.1和veth1.1分别桥接至br0,br1,并配置相关信息

# ovs-vsctl add-port br0 veth0.1

# ovs-vsctl add-port br1 veth1.1

# ip link set veth0.1 up

# ip link set veth1.1 up

# ovs-vsctl set port veth0.1 tag=5        tag实际就是配置vlan,否则在vlan 5的容器内流量不会经过此接口

此时可以测试容器的通信(容器内ping 10.0.0.253,ping 192.168.1.221)

7.添加SNAT和DNAT规则

SNAT:使得容器box1和box2能访问外网

# ip netns exec r1 iptables –t nat –A POSTROUTING –s 10.0.0.1/32 –j SNAT –-to-source 192.168.2.223

# ip netns exec r1 iptables –t nat –A POSTROUTING –s 10.0.0.2/32 –j SNAT –-to-source 192.168.2.224

DNAT:使得外网能够访问容器

# ip netns exec r1 iptables –t nat –A PREROUTING –d 192.168.2.223/32 –j DNAT –-to-destination 10.0.0.1

# ip netns exec r1 iptables –t nat –A PREROUTING –d 192.168.2.224/32 –j DNAT -–to-destination 10.0.0.2

 
8.给br1配置IP并测试整个通信

# ifconfig br1 192.168.1.122

最后网桥br0和br1的接口信息:

测试整个网络的通信

在容器中(box1):ping 10.0.0.2,ping 10.0.0.253,ping 192.168.1.221,ping 192.168.1.223,ping 192.168.1.224,ping 192.168.1.122,ping 192.168.1.222(本机ip)

在本机中(192.168.1.222):ping 192.168.1.122,ping 192.168.1.223,ping 192.168.1.224,ping 192.168.1.221

以上

docker+openvswitch实现主机与容器的网络通信的更多相关文章

  1. [转]Docker 生产环境之配置容器 - 限制容器资源

    默认情况下,容器没有资源限制,可以使用主机内核调度程序允许的给定资源.Docker 提供了一些方法来控制容器可以使用多少内存.CPU 或块 IO,并设置 docker run 命令的运行时配置标志.本 ...

  2. Docker容器学习梳理 - 容器间网络通信设置(Pipework和Open vSwitch)

    自从Docker容器出现以来,容器的网络通信就一直是被关注的焦点,也是生产环境的迫切需求.容器的网络通信又可以分为两大方面:单主机容器上的相互通信,和跨主机的容器相互通信.下面将分别针对这两方面,对容 ...

  3. Docker 网络模式详解及容器间网络通信

    当项目大规模使用 Docker 时,容器通信的问题也就产生了.要解决容器通信问题,必须先了解很多关于网络的知识.Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜 ...

  4. Docker的单主机容器网络

    作者:杨冬 欢迎转载,也请保留这段声明.谢谢! 出处: https://andyyoung01.github.io/ 或 http://andyyoung01.16mb.com/ 本篇文章主要探索Do ...

  5. Docker:使用Ambassador进行跨主机间容器通信

    转载请注明出处:点我 由于Docker自身的网络的原因,想要在多主机间的容器之间进行通信是比较麻烦的事情.可以利用Ambassador容器来实现这一功能. 基本原理: 利用Ambassador来实现主 ...

  6. docker 现实---联网多台物理主机,容器桥到物理网络(三)

    docker 默认桥接卡docker0 只有当这个单元中的所有容器桥接卡.例如,在主机虚拟网络适配器容器看通常称为veth***  和docker只要把这些卡桥接在一起,例如下面的附图: waterm ...

  7. [docker]使用quaaga实现(rip ospf)实现主机间容器互通

    使用quaaga实现(rip ospf)实现主机间容器互通 - n1设置 brctl addbr br0 ip a a 10.1.1.1/24 br0 ip a a 10.1.1.1/24 dev b ...

  8. docker中宿主机与容器(container)互相拷贝传递文件的方法

    转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/71425077 本文出自[我是干勾鱼的博客] 前面讲解过如何进入.退出docker ...

  9. Docker OpenvSwitch 介绍 or 工作原理

    Docker OpenvSwitch Network 介绍 什么是OpenVSwich OpenvSwich Network:属于第三方网络项目,可以理解为是一个标准的交换机协议. OpenvSwic ...

随机推荐

  1. Visualization of Detail Point Set by Local Algebraic Sphere Fitting

    Refers to Dynamic Sampling and Rendering of Algebraic Point Set Surfaces Growing Least Squares for t ...

  2. WPF:完美自定义MeaagseBox 动画 反弹 背景模糊 扁平化

    不知道为什么,WPF的MeaageBox的风格还停留在Win 2000的风格... 很久前就想自己封装一个MessageBox出来,但是都只是简单的封装,不怎么具有通用性.这次终于搞完了. 使用方法和 ...

  3. mysql 获取一张表中, 另一张表不存在的数据

    编写sql语句中,经常需要编写获取一张数据表中不存在与另一张表的数据,相关编写方法如下: 方法1: 使用not in ,效率低下,在数据较小的情况下可以采用如下编写 SELECT * FROM a A ...

  4. redis搭建主从(1主2从)

    一,先附上配置文件 1,master(6379.conf)上面的配置文件 daemonize yes pidfile /usr/local/redis/logs/redis_6379.pid port ...

  5. sql server 计算两个时间 相差的 几天几时几分几秒

    CAST ( CAST ( DATEDIFF ( ss, StartTime, ConcludeTime ) / ( 60 * 60 * 24 ) AS INT ) AS VARCHAR ) + '天 ...

  6. SQLServer2016 AlwaysOn AG基于工作组的搭建笔记

    最近搭建了一套SQLServer2016 AlwaysOn AG. (后记:经实际测试,使用SQLServer2012 也同样可以在Winserver2016上搭建基于工作组的AlwaysOn AG, ...

  7. MYSQL主从同步/主主同步

    一.MYSQL主从同步 注意:进行主从同步操作时需要确保DB无写操作 flush tables with read lock:   //全局读锁定,执行了命令之后所有库所有表都被锁定只读. 1.在主机 ...

  8. python scapy的用法之ARP主机扫描和ARP欺骗

    python scapy的用法之ARP主机扫描和ARP欺骗 目录: 1.scapy介绍 2.安装scapy 3.scapy常用 4.ARP主机扫描 5.ARP欺骗 一.scapy介绍 scapy是一个 ...

  9. Python:字符串格式化

    Python中提供了多种格式化字符串的方式,遇到一个项目,在一个文件中,就用了至少两种方式.特别是在使用Log时,更让人迷惑. 因此特地花时间来了解一下Python中字符串格式化的几种方式: # -* ...

  10. PHP编程效率

    1.如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍.2.$row['id'] 的速度是$row[id]的7倍.3.echo 比 print 快,并且使用echo的 ...