前言:前面的部分一直都是单机跑docker,但实际生产环境不可能只用一台来跑。肯定会用到多台,因为他们都是内部私有ip,那么多台主机之间的容器如何通信?这个是个很头疼的问题!目前主流几种方法如下:
1、使用路由机制打通网络
2、使用Open vSwitch(OVS)打通网络
3、使用flannel来打通网络
4、使用Quagga来实现自动学习路由

第一种:使用路由机制打通网络
使用Linux的路由来打通网络
优点:

  • 常规路由技术
  • 使用传统网络技术
  • 简单
  • 高性能

缺点:

  • 与现有网络融为一体
  • 灵活性低

现在有两台Docker实例:
<ignore_js_op> 
file:///C:/Users/Don/Documents/My%20Knowledge/temp/d12921d0-891e-4a7f-9f37-4addd92a86fc_128_files/6325797f-dd7c-433e-aacc-dd447f7cbbaf.png

具体如图,因为Docker默认的内部ip为172.17.42网段,所以必须要修改其中一台的默认网段以免ip冲突。
#vim /etc/sysconfig/docker-network

DOCKER_NETWORK_OPTIONS= --bip=172.18.42.1/16 -H fd:// -H=unix:///var/run/docker.sock

#systemctl daemon-reload
#reboot
<ignore_js_op> 
file:///C:/Users/Don/Documents/My%20Knowledge/temp/d12921d0-891e-4a7f-9f37-4addd92a86fc_128_files/96e55b20-d530-4526-ac7a-7763b2628350.png

ok。现在就可以开始操作了。
其实就是执行两台route add命令
docker 130上执行 route add -net 172.18.0.0/16 gw 192.168.18.128
docker 128上执行 route add -net 172.17.0.0/16 gw 192.168.18.130
ok,现在两台宿主机里的容器就可以通信了。

第二种:使用Open vSwitch(OVS)打通网络
是一种主流的虚拟化大二层技术
优点:

  • 灵活
  • 对现有物理网络没要求
  • 业界主流

缺点:

  • 软件封装导致性能下降
  • 复杂度相对较高
  • 排错难度高

/* /usr/bin/                  #拷贝可执行文件至系统变量path

使用systemd来管理flannel服务

vim /usr/lib/systemd/system/flanneld.service

[Unit]
Description=Flanneld overlay address etcd agent
After=network.target
Before=docker.service
[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/flanneld
EnvironmentFile=-/etc/sysconfig/docker-network
ExecStart=/usr/bin/flanneld -etcd-endpoints=${FLANNEL_ETCD} $FLANNEL_OPTIONS
[Install]
RequiredBy=docker.service
WantedBy=multi-user.target

设置etcd地址

vim /etc/sysconfig/flanneld
FLANNEL_ETCD= "http://192.168.1.121:2379"

由于flannel将覆盖docker0网桥,所以如果Docker服务已启动,则停止Docker服务

编写flannel启动脚本,并加入自启动
vim /etc/init.d/start_flannel.sh
#!/bin/bash
systemctl stop docker                     #停止docker服务
systemctl restart flanneld                #启动flannel服务
mk-docker-opts.sh -i                      #生成环境变量
source /run/flannel/subnet.env            #将环境变量生效
ifconfig docker0 ${FLANNEL_SUBNET}        #设置docker0的网卡ip
systemctl start docker                    #启动docker服务

ok,现在跨主机容器间已经可以通信。

第四种:使用Quagga来实现自动学习路由

其实这种方式是基于第一种方式的路由技术,只不过路由信息不需要自己手动添加,而是自动学习。试想一下,如果有10台docker,那么每台docker就需要手动写9条路由信息,是不是很惨?
Linux上安装路由器的软件名为Quagga,它可以配置很多种企业级的动态路由协议。我使用的是RIPV2和OSPF同时开启,但安装Quagga的方法和配置命令,太过于繁琐。所以网上有大神将其Docker化了。

下载Quagga镜像:
docker pull index.alauda.cn/georce/router

备用地址:http://pan.baidu.com/s/1sj26X8T
特别需要注意的是:docker0的网段不能一样,所以需要修改docker的子网地址,参考第一种的设置办法
运行镜像:
docker run -itd --name=router --privileged --net=host index.alauda.cn/georce/router

执行 ip route 查看下路由表,已有别的docker0的网段信息。
<ignore_js_op>

file:///C:/Users/Don/Documents/My%20Knowledge/temp/d12921d0-891e-4a7f-9f37-4addd92a86fc_128_files/4ee4e27c-94ed-4b68-8cd3-838467346fe3.png

file:///C:/Users/Don/Documents/My%20Knowledge/temp/d12921d0-891e-4a7f-9f37-4addd92a86fc_128_files/cd3ce34f-621a-488b-818d-ff2c69e365f0.png

<ignore_js_op>

007.png (50.47 KB)

下载附件  保存到相册

2015-12-11 10:11 上传

 

最新文章

  1. 深入理解DIP、IoC、DI以及IoC容器
  2. FTP多任务下载实现类
  3. jQuery.validator 验证规则详解
  4. GX转账站点无法访问的问题
  5. java-两个大数相加
  6. 简易模仿手机拨号盘浮在ListView之上并且展开,折叠效果
  7. 解决 MVC 用户上线下线状态问题
  8. oracle 修改密码,解锁
  9. codeforces 434B B. Nanami&#39;s Digital Board(分治)
  10. selenium-python iframe用法
  11. cocos2d-x 详解之 CCAction(动作)
  12. LeetCode OJ学习
  13. 【Java并发编程】并发编程大合集-值得收藏
  14. 由RGB到HSV颜色空间的理解
  15. Python的对象和类型
  16. 思维导图(自己整理,希望对大家有用):JavaScript函数+canvas绘图+Array数组
  17. hdu2108 Shape of HDU 极角排序判断多边形
  18. Airbnb/Apache Superset – the open source dashboards and visualization tool – first impressions and link to a demo
  19. C# Npoi 实现Excel与数据库相互导入
  20. 练习:javascript淡入淡出半透明效果

热门文章

  1. C. Banh-mi
  2. 第三次作业(1) Visual Studio程序安装过程和练习过程
  3. Pair Work:电梯调度算法的实现和测试 by 12061171 and 12061168
  4. Scrum Meeting NO.9
  5. git心得
  6. Sprint 冲刺第三阶段第二天
  7. PostgreSQL之Sequence序列(转)
  8. [Java] Thread的start()和run()函数区别
  9. loadrunner测试结果三
  10. python之tkinter使用-Grid(网格)布局管理器