docker network

摘要:
etcd通常部署在单独的机器上,通道部署在docker节点上,这需要部署在每个docker节点。

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

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

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


缺点:

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


现在有两台Docker实例:
 docker network第1张




具体如图,因为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
 docker network第2张



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)打通网络
是一种主流的虚拟化大二层技术
优点:

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


缺点:

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


流程图如下:
 
 docker network第3张

docker network第4张




首先安装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。
下图解释了数据报通过覆盖网络转发的路线:
 
docker network第5张

部署也不是很复杂,仅需要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第6张

docker network第7张


免责声明:文章转载自《docker network》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇注册表操作总结破解pcap文件的NTLMv2 hash以得到密码明文下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

docker的thin pool 和 ulimit问题

docker出现thin pool问题后,要手动地清理不用的空间。thin pool问题报错如下 docker: Error response from daemon: devmapper: Thin Pool has 9922 free data blocks which is less than minimum required 10083 free...

CentOS7安装OpenStack(Rocky版)-01.控制节点的系统环境准备

分享一下Rocky版本的OpenStack安装管理经验: OpenStack每半年左右更新一版,目前是版本是201808月发布的版本-R版(Rocky),目前版本安装方法优化较好,不过依然是比较复杂 官方文档地址:https://docs.openstack.org/install-guide/openstack-services.html 本文主要分享控...

[转载] 使用 Docker 部署 openstf 平台

转载自简书,地址:https://www.jianshu.com/p/51ed344a7ba7 1.https://www.jianshu.com/p/10bdf33d2c64 2.https://www.jianshu.com/p/ba3e4712105f 一、背景 笔者所处业务需要搭建一个云测平台,用于集中管理一批安卓系统板卡,经过方案选择,决定使用...

docker占满linux磁盘根目录的解决办法

一、磁盘根目录被占满 [test@localhost docker]$ df -lh Filesystem Size Used Avail Use%Mounted on /dev/mapper/centos-root 50G 50G 0G 100% / devtmpfs 7.7...

rancher1版本 基本使用

Rancher1-简单介绍-认识rancher  分类: Rancher 标签: rancher, Kubenetes 认识rancher 一、简介 1、什么rancher Rancher是一个开源软件平台,使组织能够在生产中运行和管理Docker和Kubernetes。使用Rancher,组织不再需要使用一套独特的开源技术从头开始构建容器服务平...

5-(微信小程序篇)关于WiFi模块配网以后利用小程序绑定设备,绑定方式说明

https://www.cnblogs.com/yangfengwu/p/11625189.html 众所周知:使用微信Airkiss 只能给设备配网,并不能够获取设备的MAC地址信息,但是我在 https://www.cnblogs.com/yangfengwu/p/11624796.html 这一节确是配网以后绑定了设备的MAC 其实绑定WIFI总结起...