docker network
前言:前面的部分一直都是单机跑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相关推荐
- docker network基础
前面介绍了nginx与php两个容器间是如何进行通信的: [root@docker ~]# docker run -d --name=php -v /www:/usr/local/nginx/html ...
- 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 ...
- docker network bridge模式,自定义(一)
自定义bridge网络相比默认的bridge是可以使用容器名ping 创建自定义bridge网络 [root@localhost claroja]# docker network create --d ...
- docker network 网络模式
安装Docker时,自动创建3个网络模式(bridge,host,none),另外和可以自己指定一个(container): 网络名 bridge host none container模式不需要列出 ...
- docker network bridge模式,默认(一)
查看docker当前创建的网络 [root@localhost claroja]# docker network ls NETWORK ID NAME DRIVER SCOPE 3c145f070fd ...
- docker php伪静态无效,解决Docker network Create加--subnet后遇到问题
本文关键详细介绍了解决Docker network Create加--subnet后碰到难题.具备非常好的实用价值,期待对大伙儿有一定的协助.一起追随我回来瞧瞧吧 Docker network Cre ...
- docker网络连接——docker network connect命令
博客作为学习笔记记录,若有理解或表述错误,欢迎指出 docker network connect 命令是用于将docker容器连接到某个网络中,或者与其他容器建联,容器可以使用容器名或者容器ID. 用 ...
- 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 ...
- docker network create: conflicts with network
用docker-compose起服务的时候,在创建网络的时候,报cannot create network xxx: conflicts with network xxxx. 解决方案: 执行 doc ...
- Docker网络 docker network
理解docker0 1.lo 本机回环地址 2.ens33 服务器内网地址 3.docker0 地址 三个网络 问题,docker 是如何处理容器网络访问的? docker run -d -P --n ...
最新文章
- 一起来学Spring Cloud | 第五章:熔断器 ( Hystrix)
- java null 转空_java 对象属性为 null 值转为 空串
- 管理系统制作的python代码_python学生管理系统代码实现
- windows7如何实现屏幕不休眠
- modem (1)---手机主叫的信道流程与Modem Log简单分析
- (二)Qt中QTableView中加入Check列实现
- 解决CentOS遇到Qt编译(error: cannot find -lGL)
- Parencodings 模拟
- iOS APP产品流水线----- 模块化开发及组件化模块化的讨论(解耦、面向接口调用、面向页面调用、封装SDK)
- java青鸟影院项目_影院在线售票云平台(仿猫眼电影,附SpringBoot项目源码) 系统功能实现...
- php实现根据身份证获取年龄的函数
- iphone计算机显示过程,iphone怎么同步显示到电脑
- 微软又犯二了!WebApi中不支持MVC的OutputCache
- ccf练习题 F1方程式冠军
- Net-speed 一键安装脚本
- bootstrap的datetimepicker使用(1.将默认的英文设置为中文2.选择日月年的时候记录之前的操作)...
- tiptop自定义发送邮件
- 徐家骏的华为十年:从DBA到副总裁的辛酸与喜悦[转载]
- Qt 菜单背景设置颜色 菜单设置颜色
- 网页Javascript潜入HTML页面方法