跟风学Docker之四:Docker网络解决方案
2019独角兽企业重金招聘Python工程师标准>>>
跟风学Docker之四:Docker网络解决方案 博客分类: docker
前言:前面的部分一直都是单机跑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包
软件包:http://pan.baidu.com/s/1mgU6YBe
1
2
3
|
# 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
配置网络
1
2
3
4
5
6
7
8
|
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
1
2
3
4
5
6
7
|
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版本为例。
1
2
|
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
1
2
3
4
5
6
7
8
9
10
11
12
|
[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
1
|
FLANNEL_ETCD= "http://192.168.1.121:2379"
|
由于flannel将覆盖docker0网桥,所以如果Docker服务已启动,则停止Docker服务
编写flannel启动脚本,并加入自启动
vim /etc/init.d/start_flannel.sh
1
2
3
4
5
6
7
|
#!/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镜像:
1
|
docker pull index.alauda.cn /georce/router
|
备用地址:http://pan.baidu.com/s/1sj26X8T
特别需要注意的是:docker0的网段不能一样,所以需要修改docker的子网地址,参考第一种的设置办法
运行镜像:
1
|
docker run -itd --name=router --privileged --net=host index.alauda.cn /georce/router
|
执行 ip route 查看下路由表,已有别的docker0的网段信息。
http://blog.liuker.cn/index.php/docker/30.html
转载于:https://my.oschina.net/xiaominmin/blog/1598759
跟风学Docker之四:Docker网络解决方案相关推荐
- Docker网络解决方案 - Calico部署记录
Docker网络解决方案 - Calico部署记录 参考文章: (1)Docker网络解决方案 - Calico部署记录 (2)https://www.cnblogs.com/kevingrace/p ...
- Docker重学系列之高级网络篇
Docker重学系列之高级网络篇 高级网络配置 说明 veth-pair技术 网络小结 Docker 网络相关的命令列表 容器访问控制 容器访问外部网络 容器之间访问 访问所有端口 访问指定端口 映射 ...
- Docker网络解决方案 - Weave部署记录
前面说到了Flannel的部署,今天这里说下Docker跨主机容器间网络通信的另一个工具Weave的使用.当容器分布在多个不同的主机上时,这些容器之间的相互通信变得复杂起来.容器在不同主机之间都使用的 ...
- Docker网络解决方案-Flannel部署记录
Docker跨主机容器间网络通信实现的工具有Pipework.Flannel.Weave.Open vSwitch(虚拟交换机).Calico实现跨主机容器间的通信.其中Pipework.Weave. ...
- Docker网络解决方案-Weave部署记录
前面说到了Flannel的部署,今天这里说下Docker跨主机容器间网络通信的另一个工具Weave的使用.当容器分布在多个不同的主机上时,这些容器之间的相互通信变得复杂起来.容器在不同主机之间都使用的 ...
- Docker的使用(五:Docker中的网络与数据管理)
实验环境 三台运行有Ubuntu 16.04 操作系统的虚拟机,并每台主机中已安装docker环境: 学习目标 docker的网络管理 docker Swarm集群的使用 Volume数据卷的使用 实 ...
- Docker 跨主机网络方案分析
PS:文章首发公众号,欢迎大家关注我的公众号:aCloudDeveloper,专注技术分享,努力打造干货分享平台,二维码在文末可以扫,谢谢大家. 上篇文章介绍了容器网络的单主机网络,本文将进一步介绍多 ...
- 【Kubernetes】k8s网络概念和实操详细说明【calico网络】【含docker不同容器网络互通配置,k8s网络互通配置】【1】
文章目录 calico网络之间通信配置[docker容器互通流程配置] calico网络原理分析 一.Calico基本介绍 二.Calico结构组成 三.Calico 工作原理 四.Calico网络方 ...
- Docker中的网络详解
本节主要是介绍Docker默认的网络行为,包含创建的默认网络类型以及如何创建用户自定义网络,也会介绍如何在单一主机或者跨主机集群上创建网络的资源需求. 1.默认网络 当你安装了docker,她自动创建 ...
最新文章
- LeetCode Reorder List
- Matlab 自带机器学习算法汇总
- SAP Fiori 1.0和2.0的区别
- 1143 Lowest Common Ancestor 甲级
- 1.5 编程基础之循环控制 44 第n小的质数
- WPF 自动选择dll,以SQLite为例
- java复试容易被刷掉吗_推免生一定被录取吗复试会被刷吗
- python---之suplot里面的twinx()函数
- C#使用IHttpModule接口修改http输出的方法浅谈
- AE 2021最新最全插件滤镜大全一键安装版下载 After Effects 2021插件合集WIN一键安装版 支持AE 2021
- 英语各类词担任的句子成分
- poj_3987 Trie图
- FBReader 探究 2
- 服务器7379如何用u盘装系统,怎么用u盘装系统 用U盘装系统安装过程步骤
- 判断三条边能否构成三角形 python
- 一张图理解线性空间,度量空间,赋范空间,巴拿赫空间,内积空间,欧几里得空间,希尔伯特空间
- 厌学孩子如何进行心理疏导[为本教育]
- python signal滤波器使用说明
- excel数字点一下才变为数值的批量快捷操作
- 神仙级控线练习,文艺极简水彩线描简笔画植物:草叶集(二)
热门文章
- python替代php,Python架构的PHP替代方案
- windows挂载linux网络文件系统NFS
- open ai gpt_让我们来谈谈将GPT-3 AI推文震撼到核心的那条推文
- Missing artifact log4j:log4j:bundle:1.2.17
- c++ 数据类型转换: static_cast dynamic_cast reinterpret_cast const_cast
- linux下查看mysql的当前连接情况
- Type Casting
- es6中的块级作用域
- 算法61---两个字符串的最小ASCII删除和【动态规划】
- ubuntu scp命令或者用root连接ssh提示:Permission denied, please try again.错误