前言:前面的部分一直都是单机跑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的网段信息。
 

转载于:https://www.cnblogs.com/bethal/p/5973522.html

docker network相关推荐

  1. docker network基础

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

  2. Docker Network 配置,自定义bridge网络

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  3. docker network bridge模式,自定义(一)

    自定义bridge网络相比默认的bridge是可以使用容器名ping 创建自定义bridge网络 [root@localhost claroja]# docker network create --d ...

  4. docker network 网络模式

    安装Docker时,自动创建3个网络模式(bridge,host,none),另外和可以自己指定一个(container): 网络名 bridge host none container模式不需要列出 ...

  5. docker network bridge模式,默认(一)

    查看docker当前创建的网络 [root@localhost claroja]# docker network ls NETWORK ID NAME DRIVER SCOPE 3c145f070fd ...

  6. docker php伪静态无效,解决Docker network Create加--subnet后遇到问题

    本文关键详细介绍了解决Docker network Create加--subnet后碰到难题.具备非常好的实用价值,期待对大伙儿有一定的协助.一起追随我回来瞧瞧吧 Docker network Cre ...

  7. docker网络连接——docker network connect命令

    博客作为学习笔记记录,若有理解或表述错误,欢迎指出 docker network connect 命令是用于将docker容器连接到某个网络中,或者与其他容器建联,容器可以使用容器名或者容器ID. 用 ...

  8. NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized“

    执行systemctl status kubelet -l 可以看到更多报错信息,我的是cni配置问题文件校验没通过 Mar 02 17:00:50 kubelet[270466]: E0302 17 ...

  9. docker network create: conflicts with network

    用docker-compose起服务的时候,在创建网络的时候,报cannot create network xxx: conflicts with network xxxx. 解决方案: 执行 doc ...

  10. Docker网络 docker network

    理解docker0 1.lo 本机回环地址 2.ens33 服务器内网地址 3.docker0 地址 三个网络 问题,docker 是如何处理容器网络访问的? docker run -d -P --n ...

最新文章

  1. 一起来学Spring Cloud | 第五章:熔断器 ( Hystrix)
  2. java null 转空_java 对象属性为 null 值转为 空串
  3. 管理系统制作的python代码_python学生管理系统代码实现
  4. windows7如何实现屏幕不休眠
  5. modem (1)---手机主叫的信道流程与Modem Log简单分析
  6. (二)Qt中QTableView中加入Check列实现
  7. 解决CentOS遇到Qt编译(error: cannot find -lGL)
  8. Parencodings 模拟
  9. iOS APP产品流水线----- 模块化开发及组件化模块化的讨论(解耦、面向接口调用、面向页面调用、封装SDK)
  10. java青鸟影院项目_影院在线售票云平台(仿猫眼电影,附SpringBoot项目源码) 系统功能实现...
  11. php实现根据身份证获取年龄的函数
  12. iphone计算机显示过程,iphone怎么同步显示到电脑
  13. 微软又犯二了!WebApi中不支持MVC的OutputCache
  14. ccf练习题 F1方程式冠军
  15. Net-speed 一键安装脚本
  16. bootstrap的datetimepicker使用(1.将默认的英文设置为中文2.选择日月年的时候记录之前的操作)...
  17. tiptop自定义发送邮件
  18. 徐家骏的华为十年:从DBA到副总裁的辛酸与喜悦[转载]
  19. Qt 菜单背景设置颜色 菜单设置颜色
  20. 网页Javascript潜入HTML页面方法

热门文章

  1. mysql多实例配置使用方法
  2. Android项目导出jar包的小技巧
  3. 如何发送Head请求
  4. ORACLE EBS中OAF屏蔽的错误
  5. vi编辑器的学习使用(十五)
  6. extra energy theory
  7. butter fly graph
  8. Agile Development
  9. 坐火车一定要带身份证
  10. MaxScript 学习笔记【有转载】