原文发表于cu:2016-06-06

参考文档:

  1. Docker网络的4种模式,pipework/ovs的简单使用等:http://www.infoq.com/cn/articles/docker-network-and-pipework-open-source-explanation-practice
  2. Dockerpool全文档:https://yeasy.gitbooks.io/docker_practice/content/index.html
  3. Ovs完全使用手册:http://my.oschina.net/tantexian/blog/648965?fromerr=C7Pp6sMs

ovs相对linux自身的brctl工具(yum install -y bridge-utils)功能上丰富许多,如vlan功能与分布式功能。

本文主要验证利用ovs的vlan功能实现跨主机的容器隔离与通信。

一.前置条件

1. 拓扑图

2. 环境说明

    1. Host1/2为VMware ESXi中的vm host,安装CentOS-7-x86_64-1511系统;
    2. 在宿主机Host1/2上各创建两个Container,为Container创建eth1端口;
    3. Container的eth1端口连接到ovs网桥,ovs网桥对接container的端口分别划分到vlan10/20;
    4. 宿主机Host1/2的网卡ens192分别桥接到各宿主机内部的 ovs网桥;
    5. 宿主机Host1/2的网卡ens192需要设置成混杂模式,并且对接的交换机端口设置为trunk端口。
    6. 网桥需要安装bridge-utils包;
    7. 常规情况下,加入bridge网络的宿主机网卡自动进入promiscuous mode,并进入forwarding state (可以使用dmesg查看);但如果宿主机是vm,需要注意调整宿主机的网卡为promiscuous mode,调整"伪传输"模式为"接受",对接虚拟网桥的端口为trunk端口。如VMware ESXi默认拒绝接受混杂模式下的数据包并且不对数据包打tag;"伪传输"模式默认为"拒绝"表示出站数据的源mac地址不同于.vmx文件中的源mac地址时,vswitch会丢弃该出站数据;"mac地址更改"模式默认为"拒绝"表示vm在操作系统层面将网卡的mac地址更改为不同于.vmx配置文件中的mac地址时,丢弃所有入站数据。 

3. pipework

#pipework本质是一个shell脚本实现,相对docker自身比较薄弱的网络配置处理方式,其可以方便地对docker网络进行配置。
[root@localhost ~]# cd /usr/local/
[root@localhost local]# git clone https://github.com/jpetazzo/pipework #可以使用软连接,复制,或增加环境变量的多种方式将pipework设为可执行命令
[root@localhost local]# ln -s /usr/local/pipework/pipework /usr/local/bin/ 

一.多主机Docker容器的vlan划分

以下操作没有特别说明,都表示在Host1上操作,Host2按照Host1操作微调即可。

1. 启动容器

#在Host1/2下启动容器test1/2/3/4;
#"--net=none"设置容器启动不带网络,由后期自定义,关于容器网络的模式请参考链接文档1
[root@localhost ~]# docker run -itd --net=none --name test1 centoswithssh
[root@localhost ~]# docker run -itd --net=none --name test2 centoswithssh
[root@localhost ~]# docker ps

2. 为容器配置网络

#用pipework添加ovs0网桥,test1网络划分到vlan10,test2网络划分到vlan20;
#pipework本质是采用shell脚本简化了ovs的操作,pipework及ovs的具体操作请参考链接文档3;
#这里并没有为ovs0网桥设置管理ip,可以根据需要设置,请参考链接1。
[root@localhost ~]# pipework ovs0 test1 192.168.1.11/24 @10
[root@localhost ~]# pipework ovs0 test2 192.168.1.12/24 @20 [root@localhost ~]# ovs-vsctl show
[root@localhost ~]# docker exec -it test1 ifconfig

3. 为网桥添加宿主机网卡

#Host1与Host2中的容器需要通信,需要把两边的网络打通,即将宿主机网卡添加到虚拟网桥中
[root@localhost ~]# ovs-vsctl add-port ovs0 ens192
[root@localhost ~]# ovs-vsctl show

4. 验证

[root@localhost ~]# docker exec -it test1 ping 192.168.1.12
[root@localhost ~]# docker exec -it test1 ping 192.168.1.13
[root@localhost ~]# docker exec -it test1 ping 192.168.1.14
[root@localhost ~]# docker exec -it test2 ping 192.168.1.13
[root@localhost ~]# docker exec -it test2 ping 192.168.1.14

预期:

  1. test1 ping test2: fail
  2. test1 ping test3: success
  3. test1 ping test4: fail
  4. test2 ping test3: fail
  5. test2 ping test4: success

根据验证结果显示,结果符合预期,请见截图:

多主机Docker容器的VLAN划分的更多相关文章

  1. 使用weave实现跨主机docker容器互联

    关于weave的原理不做细致的说明,如果想了解weave可以登陆官网:https://www.weave.works/ In this post,使用阿里云3台ECS服务器进行weave搭建,并测试搭 ...

  2. 使用openvswitch实现跨主机docker容器互联

    安装openvswitch的步骤请参考上一篇文章:http://www.cnblogs.com/xkops/p/5568167.html 环境:192.168.3.201 node1192.168.3 ...

  3. 以Docker容器方式安装Ceph

    获取Ceph的Docker镜像 因为公司对于网络环境的限制,安装ceph时使用ceph-deploy反而很不方便,且ssh免密码方式也不适用,所以使用docker方式安装. Git地址 https:/ ...

  4. Docker容器的跨主机连接

    Docker容器的跨主机连接 Docker容器的跨主机连接 使用网桥实现跨主机容器连接 网络拓扑 网络连接使用的是Bridge 操作 修改/etc/network/interfaces文件,分配静态I ...

  5. 跨主机网络概述 - 每天5分钟玩转 Docker 容器技术(48)

    前面已经学习了 Docker 的几种网络方案:none.host.bridge 和 joined 容器,它们解决了单个 Docker Host 内容器通信的问题.本章的重点则是讨论跨主机容器间通信的方 ...

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

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

  7. 利用虚拟网桥实现Docker容器的跨主机访问

    最近在研究Docker,Docker的网络配置是比较令人头疼的部分,尤其是跨主机的容器间通信,很多解决方案都比较复杂,这里,我只用虚拟网桥来实现Docker的跨主机访问,分享出来,希望对Docker学 ...

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

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

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

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

随机推荐

  1. SpringMVC找不到对应的页面

    确认springmvc配置文件视图解析器配置正确. <!-- 视图解析器 --> <bean class="org.springframework.web.servlet. ...

  2. SpringMVC转发页面405错误

    需要在该方法前加上:@ResponseBody注解 加上这个注解后可能在转发页面的时候出现问题,则需要在方法的参数中增加HttpServletRequest 和HttpServletResponse参 ...

  3. oracle数据库每天自动备份

    现在介绍一下我们项目中使用exp工具每天自动对oracle进行备份. 用这个工具我们可以使用命令行的方式也可以使用pl/sql developer来进行导出. 我们要使用exp命令来导出oracle的 ...

  4. js(jQuery)tips

    一:页面加上$(function(){***内容***})与不加的区别 1.这个是DOM加载完之后再加载JS代码,你的JS如果放在文档后面可能一样,但是如果你要是把JS放在head里面就有差别了(放在 ...

  5. hive在客户机启动时出现的问题

    运行环境:一拖一分布式集群+客户端 mysql和hive安装在客户机上 问题:在客户机终端启动hive时出现如下问题: 目前还没有找出是什么原因! 解决办法: 参照http://dblab.xmu.e ...

  6. 爬虫常用的 urllib 库知识点

    urllib 库 urllib 库是 Python 中一个最基本的网络请求库.它可以模仿浏览器的行为向指定的服务器发送请求,同时可以保存服务器返回的数据. urlopen() 在 Python3 的 ...

  7. SQL 去重 显示第一条数据 显示一条数据

    需求描述:根据某一个字段或几个字段去重来显示任一条数据,第一条或最后一条. 数据样式如下图: 尝试解决: --count(*)方法(只把条数为1条的显示出来了,超过1条全部过滤了) select * ...

  8. Linux 下 终端 相关的命令

    1. 概述 Linux 服务器, 通常可以由多个终端连接 简单介绍一些 终端 相关的操作 最终的目的, 是定位到某个终端, 然后把它 踢下来, 甚至可以不让他再次连接 2. 环境 操作系统 CentO ...

  9. Kali linux 安装

    df -m umount  /media exit

  10. 【LG4169】[Violet]天使玩偶/SJY摆棋子

    [LG4169][Violet]天使玩偶/SJY摆棋子 题面 洛谷 题解 至于\(cdq\)分治的解法,以前写过 \(kdTree\)的解法好像还\(sb\)一些 就是记一下子树的横.纵坐标最值然后求 ...