前言:前面的部分一直都是单机跑docker,但实际生产环境不可能只用一台来跑。肯定会用到多台,因为他们都是内部私有ip,那么多台主机之间的容器如何通信?这个是个很头疼的问题!目前主流几种方法如下:

1、使用路由机制打通网络

2、使用Open vSwitch(OVS)打通网络

3、使用flannel来打通网络

4、使用Quagga来实现自动学习路由



第一种:使用路由机制打通网络

使用linux的路由来打通网络

优点:

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

缺点:

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

现在有两台Docker实例:

 

具体如图,因为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

 

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)打通网络

是一种主流的虚拟化大二层技术

优点:

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

缺点:

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

流程图如下:

 

 

首先安装ovs的rpm包



file:///C:/Users/Don/Documents/My%20Knowledge/temp/d12921d0-891e-4a7f-9f37-4addd92a86fc_128_files/267978203.png



# yum install openvswitch-2.4.0-1.x86_64.rpm    #安装软件包

#
/etc/init.d/openvswitch restart          
    #重启服务

#
/etc/init.d/openvswitch status          
     #查看状态





安装网桥管理工具



#yum -y install bridge-utils



配置网络

ovs-vsctl add-br br0

ovs-vsctl add-port br0 gre1 -- set interface
gre1 type=gre option:remote_ip=192.168.18.128

#添加br0到本地docker0,使得容器流量通过ovs流经tunnel

brctl addif docker0
br0



ip link set dev br0 up

ip link set dev docker0
up

iptables -t nat -F; iptables -F

ip route add 172.17.0.0/16 dev docker0





其余节点同样的配置,注意ip地址即可。





第三种:使用flannel来打通网络

新设计的Flannel,一种结合了路由机制与隧道技术

原理:每个主机配置一个ip段和子网个数。例如,可以配置一个覆盖网络使用 10.100.0.0/16段,每个主机/24个子网。因此主机a可以接受10.100.5.0/24,主机B可以接受10.100.18.0/24的包。flannel使用etcd来维护分配的子网到实际的ip地址之间的映射。对于数据路径,flannel 使用udp来封装ip数据报,转发到远程主机。选择UDP作为转发协议是因为他能穿透防火墙。例如,AWS Classic无法转发IPoIP or GRE 网络包,是因为它的安全组仅仅支持TCP/UDP/ICMP。

下图解释了数据报通过覆盖网络转发的路线:

 

部署也不是很复杂,仅需要etcd和flannel两项支持即可。

etcd一般部署在单独机器上,那么flannel就部署在docker节点上,每个docker节点上都需部署。

1、部署etcd,假设地址为192.168.1.121

yum -y install etcd          
                 
                 
             #安装软件包

vim
/etc/etcd/etcd.conf             
                 
                 
      #修改配置文件

修改为如下:(默认只监听本地回环地址)

    ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"

    ETCD_ADVERTISE_CLIENT_URLS="http://0.0.0.0:2379"

systemctl restart
etcd                
                 
                    
 #重启服务

etcdctl set /coreos.com/network/config
'{ "Network": "10.1.0.0/16" }'    
     #添加一条网络配置记录,这个配置将用于flannel分配给每个Docker的虚拟IP地址段





2、部署flannel



https://github.com/coreos/flannel/releases 下载最新稳定版本,这里以0.5.5版本为例。

tar zxf flannel-0.5.5-linux-amd64.tar.gz      #解压文件

cp flannel-0.5.5/* /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的网段信息。

 

docker network的更多相关文章

  1. Docker Network containers

    Network containers Estimated reading time: 5 minutes If you are working your way through the user gu ...

  2. docker 小技巧 docker network create br-name 指定IP地址

    在某些情况下,使用 docker network create br-name 命令创建网络的时候,会创建一个新的网桥,该网桥的默认IP地址为172.18.0.0\16(或相临的IP地址段) 这个ip ...

  3. Docker: docker network 容器网络

    容器网络命令 : docker network --help 常用的是 docker network create/ls/rm/inspect 容器网络类型,一共有以下5种 bridge–net=br ...

  4. docker network基础

    前面介绍了nginx与php两个容器间是如何进行通信的: [root@docker ~]# docker run -d --name=php -v /www:/usr/local/nginx/html ...

  5. learning docker steps(8) ----- docker network 初次体验

    参考: docker network 主要是介绍了docker 容器之间的组网模式, 一般来说实像组网主要是依赖于bridge iptalbes vlan来实现,但是附带的如端口转发会降低效率. 新型 ...

  6. 【docker】docker network常用命令参数

    1.帮助命令 docker network --help 2.查看docker默认三种网络 docker network ls 3.创建自定义网络,如果不指定,默认创建类型为bridge类型 dock ...

  7. Docker network整理

    一.简介 默认情况下容器与容器.容器与宿主机的网络是隔离开来的, 当你安装docker的时候,docker会创建一个桥接器docker0,通过它才让容器与容器.容器与宿主机之间通信. Docker安装 ...

  8. (转)Docker network命令

    转:https://blog.csdn.net/gezhonglei2007/article/details/51627821 原文地址:https://docs.docker.com/engine/ ...

  9. Docker - 命令 - docker network

    概述 docker network 命令 背景 newwork 是 docker 的一种资源 经常会使用 需要整理命令 1. 引入 概述 docker run 时, 将容器端口映射到宿主机 场景 启动 ...

  10. docker network 参数

    一. 格式 docker network COMMAND 二.COMMAND 讲解 2.1 .docker network connect 格式 docker network connect [OPT ...

随机推荐

  1. Python学习笔记——进阶篇【第九周】———协程

    协程 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是协程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来 ...

  2. 洛谷-均分纸牌-NOIP2002提高组复赛

    题目描述 Description 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,但纸牌总数必为 N 的倍数.可以在任一堆上取若于张纸牌,然后移动. 移牌规则为:在编号为 1 堆上取的纸 ...

  3. VM10下Ubuntu无法安装vim的问题

    今天在VM10下重装了Ubuntu14.10,安装vim时发现如下问题 谷歌了一下,终于找到一种方法解决. 终端下: sudo vi /etc/apt/source.list 该命令将用vi打开一个文 ...

  4. python基础(八)-迭代器与生成器

    一.迭代器 li=[1,2,3] f=li.__iter__() print(f) print(f.__next__()) print(f.__next__()) print(f.__next__() ...

  5. 使用sublime text3 连接sftp/ftp(远程服务器)

    首先说明的是Sumblime Text 3,下载安装后,打开软件 在红色箭头指定的控制区域粘贴下面这段英文 import urllib.request,os,hashlib; h = '2915d18 ...

  6. iOS 打包上传AppStore相关(3)-iTunes相应配置以及使用蒲公英网站进行应用托管分发(链接/二维码)

    上一篇讲到我们最终生成了一个格式为 .xcarchive 的文件(可以右键并Show in Finder)查看.本篇我们就进行最后的设置,打包上传.另外,还有一个小福利,那就是打测试包分发链接测试. ...

  7. 如何判断Socket已经关闭

    引子 前段时间我们的服务由于一台交换机网络出现故障,导致数据库连接不上,但是在数据库的连接超时参数设置不合理,connect timeout设置的过长,导致接口耗时增加.DB连接超时后线程未正常结束, ...

  8. input 和raw_input

    ---恢复内容开始--- 因为看python2 和 3 混了,所以两者里面的东西有点乱input 和raw_input 今天终于搞明白了,在这里记录一下: 1.python 2 中raw_input ...

  9. 在Ubuntu下搭建FTP服务器的方法

    由于整个学校相当于一个大型局域网,相互之间传送数据非常快,比如要共享个电影,传点资料什么的. 所以我们可以选择搭建一个FTP服务器来共享文件. 那么问题来了,有的同学会问,我们既然在一个局域网内,直接 ...

  10. linux强制svn提交时必须写注释

    打开hooks,然后将pre-commit.tmpl修改为pre-commit,打开pre-commit,写入如下代码: #!/bin/sh REPOS="$1" TXN=&quo ...