OpenvSwitch实现Docker容器跨宿主机互联

1. OpenvSwitch简介

Open vSwitch(下面简称为 OVS)是由 Nicira Networks 主导的,运行在虚拟化平台(例如 KVM,Xen)上的虚拟交换机。在虚拟化平台上,OVS可以为动态变化的端点提供 2 层交换功能,很好的控制虚拟网络中的访问策略、网络隔离、流量监控等等。主要实现代码为可移植的C代码。

它的目的是让大规模网络自动化可以通过编程扩展,同时仍然支持标准的管理接口和协议(例如NetFlow,sFlow,SPAN,RSPAN,CLI,LACP,802.1ag)。此外,它被设计为支持跨越多个物理服务器的分布式环境,类似于vmware的vmnetwork分布式switch或cisconexus 1000v。Open vSwitch支持多种Linux虚拟化协议,包括Xen/Xen Server,KVM,和VirtualBox。

2. 通过VxLAN方式实现容器跨宿主机通信

本次测试通过OpenvSwitch的VxLAN网络,实现两台物理主机容器能够跨宿主机互访。

    2.1 拓扑图

    2.2 配置ovs

(1)这里通过两个脚本来配置host10和host11两台主机的OpenvSwitch部分。如下:

#host10
[[email protected] ~]# cat vsctl-add.sh
#!/bin/bash
ovs-vsctl add-br br0  #新建两个虚拟交换机
ovs-vsctl add-br br1

ifconfig eth0 0 up    #将物理主机ip赋值给br1
ifconfig br1 192.168.1.10/24 up
route add default gw 192.168.1.1

ovs-vsctl add-port br1 eth0  #将eth0加入br1
ovs-vsctl add-port br0 docker0  #将docker0加入br0

ifconfig br0 172.17.0.2/24 up  #配置br0和docker0的IP
ifconfig docker0 172.17.0.1/24 up

#host11
[[email protected] ~]# cat vsctl-add.sh
#!/bin/bash
ovs-vsctl add-br br0  
ovs-vsctl add-br br1

ifconfig eth0 0 up
ifconfig br1 192.168.1.11/24 up
route add default gw 192.168.1.1
ovs-vsctl add-port br1 eth0
ovs-vsctl add-port br0 docker0

ifconfig br0 172.17.0.4/24 up
ifconfig docker0 172.17.0.3/24 up

提示:以上两个脚本在物理主机上通过ssh执行时通过 nohup ./vsctl-add.sh & 方式执行,否则会出现
网络断掉执行不成功的情况。

(2)配置VxLAN实现跨主机互联

#host10
ovs-vsctl add-port br0 vx1 -- set interface vx1 type=vxlan options:remote_ip=192.168.1.11

#host11
ovs-vsctl add-port br0 vx1 -- set interface vx1 type=vxlan options:remote_ip=192.168.1.10

#执行完毕后查看
[[email protected] ~]# ovs-vsctl show
a8251e22-bb31-4ee6-8321-49fbd0f1b735
    Bridge "br0"
        Port "vx1"
            Interface "vx1"
                type: vxlan
                options: {remote_ip="192.168.1.11"}
        Port "veth1pl5407"
            Interface "veth1pl5407"
        Port "br0"
            Interface "br0"
                type: internal
        Port "docker0"
            Interface "docker0"
        Port "veth1pl4977"
            Interface "veth1pl4977"
    Bridge "br1"
        Port "eth0"
            Interface "eth0"
        Port "br1"
            Interface "br1"
                type: internal

    2.3 创建四个容器

这里通过pipework固定容器IP地址,以后加入到/etc/rc.local里面实现开机启动自动配置。

#host10
docker run -itd --net=none --name test1 centos:6 /bin/bash
docker run -itd --net=none --name test2 centos:6 /bin/bash
pipework br0 test1 172.17.0.101/[email protected]
pipework br0 test2 172.17.0.102/[email protected]

#host11
docker run -itd --net=none --name test3 centos:6 /bin/bash
docker run -itd --net=none --name test4 centos:6 /bin/bash
pipework br0 test3 172.17.0.103/[email protected]
pipework br0 test4 172.17.0.104/[email protected]

    2.4 测试

从test1容器访问另外三个容器可以正常通讯。

3. 总结

通过这个配置可以看到OpenvSwitch的强大之处,ovs不仅仅用于docker容器,还可以应用虚拟主机网络。通过软件定义网络,极大的简化了网络配置。docker在1.9版本之后加入overlay网络,运用的也是ovs技术。

时间: 2024-10-19 07:48:28

OpenvSwitch实现Docker容器跨宿主机互联的相关文章

docker容器共享宿主机环境,从而为镜像体积减负

一.背景介绍 响应公司技术发展路线,开发的服务均需要将打成docker镜像,使用docker进行统一管理.可是随着服务越来越多,镜像也越来越多.每次制作镜像的时候都需要将依赖打进容器,这样一个jre的环境就是100多M.有一天突发奇想,容器能不能共用宿主机的环境?这样每次打镜像时体积就会少不少.于是就动手试试了试,结果还真可以,哈哈. 二.测试 我们测试用的是java的web项目做的测试,框架用的springboot,由于集成了tomcat插件,所以web项目打成jar包即可运行. 1.在宿主机

让docker容器和宿主机使用同一网段

system os:  centos 7.2 4.7.0-1.el7.elrepo.x86_64 docker version: 1.12.0 1.创建一个network docker network create -d macvlan  --subnet=192.168.209.0/24 --gateway=192.168.209.2 -o parent=eno16777728 mynet -d macvlan  加载kernel的模块名--subnet 宿主机所在网段--gateway 宿主

Docker 容器与宿主机网段冲突导致网络无法 ping 通的解决方案

docker 容器网络默认使用 bridge 桥接模式,正常情况下,容器会使用 daemon.json 中定义的虚拟网桥来与宿主机进行通讯. 最近更新 Docker for mac 之后,发现以前容器中可以访问的局域网内服务(使用宿主机所在的局域网 IP 访问),变得不可访问了.一开始以为是新版本改了默认网络配置,查了半天 release log 并没有找到相关条目. 后来在同事的帮助下发现问题所在: 由于换了新的工位,宿主机的局域网 IP 网段由 172.16.*.* 切换到了 172.17.

docker 容器和宿主机相互拷贝数据

docker 从容器中向主机拷贝数据: sudo docker cp <containerId>:/file/path/within/container /host/path/target /file/path/within/container : 容器里面的目录 /host/path/target : 主机目录 sudo docker cp 88fc08c48349:/opt/apache-tomcat-8.0.41/logs /opt/logs/ ---------------------

docker容器跨服务器的迁移方式export和save

前沿: 这两天把报警平台放在了docker里面跑了,但是宿主机本身性能就不好,所以导致mongodb到挂了好几次了.这次搞了一台牛逼的服务器,虽说是opentstack里面的主机,但是iops 很不错. 感谢向军同学的帮助,不然就升级uek内核就能搞死我. 你的程序放在docker里面迁移起来很是方便,像是以前的话,需要重新部署环境和静态文件. 放在docker里面的话,只是需要export备份封装后,scp.rsync迁移到别的服务器就可以了. 我这边的redis和mongodb分在不同的容器

Docker容器跨主机多网段通信解决方案

实现Docker的跨主机网络通信的方案有很多,比如在之前博文中写到的通过部署consul服务实现Docker容器跨主机通信 ,但是consul服务并不能实现多个网段跨主机进行通信,在这种情况之下,MacVlan的概念就应用而生了. Macvlan工作原理: Macvlan是Linux内核支持的网络接口.要求的Linux内部版本是v3.9–3.19和4.0+: 通过为物理网卡创建Macvlan子接口,允许一块物理网卡拥有多个独立的MAC地址和IP地址.虚拟出来的子接口将直接暴露在相邻物理网络中.从

docker容器与物理机之间拷贝文件的方法

一般情况下,我们在启动容器的时候可以使用-v参数映射宿主机的文件或者目录到容器里,这样的话,在宿主机相关目录下的文件修改会自动在容器里生效. 但是,如果我们已经启动了一个容器的话,就只能使用下面的这种方式在容器和宿主机之间拷贝文件了. docker ps 获取目标容器的ID或者容器的名称    # 我这里的是容器ID为52261df2fab6 docker inspect -f'{{.Id}}' 容器的ID       # 获取容器的ID全名称 得到一串类似52261df2fab612b24b3

虚拟机安装、创建到实现虚拟机与宿主机互联

虚拟机安装.创建到实现虚拟机与宿主机互联 本次实验主要是为了介绍如何安装创建虚拟机,帮助虚拟机与宿主机配置同网段IP,实现宿主机与虚拟机互通,实现匿名every one的共享访问.具体步骤如下: 一. 首先从网上下载VMware12安装包打开等待安装进度条 单击下一步 点击安装 更改一下文件安装路径,建议不要放到系统盘(C:):,点击下一步 然后耐心等待.... 安装条到头之后取消勾选两项,点击下一步: 点击许可证,录入激活密匙: 安装完成,打开虚拟机,创建一个新的虚拟机: 然后点击自定义选项,

Docker容器和本机之间的文件传输 使用Docker部署Tomcat项目

Docker容器和本机之间的文件传输. http://blog.csdn.net/leafage_m/article/details/72082011 使用Docker部署Tomcat项目 http://blog.csdn.net/leafage_m/article/details/72081987