十、Docker网络以及跨宿主机通信_192.168.101.-程序员宅基地

技术标签: docker  

讲在前面:
1.目前实现的是单机部署,如何创建镜像,管理镜像;如何创建容器,管理容器;如何快速创建docker虚拟主机machine,如何快速部署多组件项目compose以及如何跨宿主机建立集群swarm。
2.docker单机通信是docker0桥接eth0,那么跨主机如何使得不同的eth0之间以及docker0之间实现通信呢? 这就是这儿要学习的地方了。

再给自己科普一下基础的网络原理
二层交换技术:工作在OSI七层网络模型的第二层,通过MAC地址进行帧转发。
三层交换技术:也称为IP交换技术,工作在OSI七层网络模型的第三层,通过IP地址进行包转发。它解决了局域网中网段划
分之后,网段中子网必须依赖路由器进行管理的局面。
网桥(Bridge):工作在OSI七层网络模型的第二层,根据MAC地址转发,类似于二层交换机。Linux网桥将不同的网络接口
连接起来,连接的网络接口可以来自不同的局域网,网桥决定了接收的数据包是转发给同一个局域网内主机还是别的网络上。 VLAN( Virtual Local Area Network,虚拟局域网):在物理网络(通常路由器接口)基础上建立一个或多个逻辑子网, 将一个大的广播域切分若干小的广播域。一个VLAN就是一个广播域,VLAN之间通信通过三层路由器来完成

容器跨主机通信主流方案:
Docker Overlay
Docker Macvlan
Weave
OpenvSwitch
这里我们依次做下实验,然后看看架构图,最后比较一下各种方案的优劣。

一、overlay(VXLAN NVGRE STT)
Overlay Network:覆盖网络,在基础网络上叠加的一种虚拟网络技术模式,该网络中的主机通过虚拟链路连接起来。 Overlay网络有以下三种实现方式:
VXLAN(Virtual Extensible Local Area Network,虚拟可扩展局域网),通过将物理服务器或虚拟机发出的数据包封装 到UDP中,并使用物理网络的IP/MAC作为外层报文头进行封装,然后在IP网络上传输,到达目的地后由隧道端点解封装并将 数据发送给目标物理服务器或虚拟机,扩展了大规模虚拟机网络通信。
由于VLAN Header头部限制长度是12bit,导致只能分配4095个VLAN,也就是4095个网段,在大规模虚拟网络。VXLAN标准定 义Header限制长度24bit,可以支持1600万个VLAN,满足大规模虚拟机网络需求。

VXLAN有以下核心技术组成:
就可基于三层 基础网络建立二层虚拟化网络。
VTEP(VXLAN Tunnel Endpoints,VXLAN隧道端点):封装在NVE中,用于VXLAN报文的封装和解封装。
VNI(VXLAN Network Identifier,VXLAN网络标识ID):类似于VLAN ID,用于区分VXLAN段,不同的VXLAN段不能直接二层 网络通信。

所以docker是如何基于overlay实现的跨主机通信呢?
先决条件1:
VTEP作为隧道端点 分别在不同的宿主机上处理eth0来的请求,并且转发到不同的容器
先决条件2:
VXLAN在不同宿主机之间建立tunnel网络(这里实现报文封装,通过IP实现传输),发送udp报文到VTEP(报文解密),实现通信。

另外两种覆盖网络简介一下:
NVGRE(Network Virtual using Generic Routing Encapsulation,使用GRE虚拟网络):与VXLAN不同的是,NVGRE没有采 用标准传输协议(TCP/UDP),而是借助通用路由封装协议(GRE)。采用24bit标识二层网络分段,与VXLAN一样可以支持 1600万个虚拟网络。
STT(Stateless Transport Tunneling,无状态传输隧道):模拟TCP数据格式进行封装,改造了TCP传输机制,不维护TCP 状态信息。

二、Docker主机之间容器通信解决方案
桥接宿主机网络(建网桥)
端口映射(暴露端口 iptables转发)
Docker网络驱动
- Overlay:基于VXLAN封装实现Docker原生Overlay网络
- Macvlan:Docker主机网卡接口逻辑上分为多个子接口,每个子接口标识一个VLAN。容器接口直接连接Docker主机 网卡接口,通过路由策略转发到另一台Docker主机
第三方网络项目
隧道方案
-Flannel:支持UDP、VXLAN、Host-gw和AWS-VPC四种工作模式
-Weave:支持UDP(sleeve模式)和VXLAN(优先fastdp模式)
-OpenvSwitch:支持VXLAN和GRE协议
路由方案
- Calico:支持BGP协议和IPIP隧道。每台宿住主机作为虚拟路由,通过BGP协议实现不同主机容器间通信

三、实践一波
test1.consul的实验

Docker通过overlay网络驱动程序支持多主机容器网络通信。 要想使用Docker原生Overlay网络,需要满足以下任意条件:
Docker运行在Swarm模式
使用键值存储的Docker主机集群

我们这里演示第二种,需要满足以下条件:
1.集群中主机连接到键值存储,Docker支持Consul、Etcd和Zookeeper;
2.集群中主机运行一个Docker守护进程;
3.集群中主机必须具有唯一的主机名,因为键值存储使用主机名来标识集群成员;
4.集群中Linux主机内核版本3.12+,支持VXLAN数据包处理,否则可能无法通信。

节点1/键值存储:192.168.101.200
节点2/扩展节点:192.168.101.201

下载并且安装consul
# wget https://releases.hashicorp.com/consul/0.9.2/consul_0.9.2_linux_amd64.zip
# unzip consul_0.9.2_linux_amd64.zip 
# mv consul /usr/bin/consul && chmod +x /usr/bin/consul

Server1 server

mkdir /opt/d_c
nohup consul agent -server -bootstrap -data-dir /opt/d_c -bind=192.168.101.200 &

Server2 agent

mkdir /opt/d_c
nohup consul agent -data-dir /opt/d_c -bind=192.168.81.59 &
加入server 
consul join 192.168.101.200
.节点配置节点201的守护进程连接Consul
# vi /lib/systemd/system/docker.service
[Service]
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store consul:// 192.168.101.200:8500 --cluster-advertise 192.168.101.200:2375 使得重启的时候能找到consul的服务端
# systemctl restart docker

查看Docker网络内的成员
consul members list

Server1:
docker run -d --net=multihost --name=web1 nginx
docker exec -it web1 /bin/bash
Server2:
docker run -d --net=multihost --name=web2 nginx
docker exec -it web2 /bin/bash

ping web1
ping web2

创建指定静态IP的network
docker network create -d overlay --ip-range=192.168.2.0/24 --gateway=192.168.2.1 --subnet=192.168.2.0/24 multihost2

工作原理图

test2.macvlan
Macvlan Bridge模式:
1.创建macvlan网络
docker network create -d macvlan –subnet=172.100.1.0/24 –gateway=172.100.1.1 -o parent=eth0 macvlan_net
2.测试互通
macvlan-01# docker run -it –net macvlan_net –ip=172.100.1.10 busybox
macvlan-02# docker run -it –net macvlan_net –ip=172.100.1.11 busybox ping 172.100.1.10
Macvlan VLAN Bridge模式:
1.创建一个VLAN,VLAN ID 50
ip link add link eth0 name eth0.50 type vlan id 50
2.创建Macvlan网络
docker network create -d macvlan –subnet=172.18.50.0/24 –gateway=172.18.50.1 -o parent=eth0.50 macvlan_net50
3.测试互通
macvlan-01# docker run -it –net macvlan_net50 –ip=172.18.50.10 busybox
macvlan-02# docker run -it –net macvlan_net50 –ip=172.18.50.11 busybox ping 172.18.50.10

test3.Weave

Weave优点

1)支持主机间通信加密;

2)支持container动态加入或者剥离网络;

3)支持跨主机多子网通信。

缺点

1)不支持服务发现,主机不能动态加入节点网络;

2)只能通过weave launch或者weave connect加入weave网络。

Weave是由Zett.io公司开发的,它能够创建一个虚拟网络,用于连接部署在多台主机上的Docker容器,这样容器就像被接入了同一个网络交换机,那些使用网络的应用程序不必去配置端口映射和链接等信息。外部设备能够访问Weave网络上的应用程序容器所提供的服务,同时已有的内部系统也能够暴露到应用程序容器上。Weave能够穿透防火墙并运行在部分连接的网络上,另外,Weave的通信支持加密,所以用户可以从一个不受信任的网络连接到主机。
这里写图片描述

这里写图片描述

这里写图片描述

简单使用

准备
1. host1: 10.0.2.6
2. host2: 10.0.2.8
3. host1上的应用容器1: 192.168.0.2/24 host1上的应用容器2: 192.168.1.2/24
4. host2上的应用容器1: 192.168.0.3/24
两台机上均安装Docker及Weave,并均启动好Weave路由容器。

在两台机上均启动一个应用容器。可以直接使用weave run命令,也可以先使用docker run启动好容器,然后使用weave attach命令给容器绑定IP地址。

# weave run 192.168.0.2/24 -itd ubuntu bash

或者

# docker run -itd ubuntu bash
# weave attach 192.168.0.2/24 $ID

此时发现两个容器之间是不通的,需要使用weave connect命令在两台weave的路由器之间建立连接。

# weave connect 10.0.2.8

会发现,此时位于两台不同主机上的容器之间可以相互ping通了。但是处于不同子网的两个容器是不能互联的,这样我们就可以使用不同子网进行容器间的网络隔离了。

我们会发现,如果不使用Docker的原生网络,在容器内部是不能访问宿主机以及外部网络的。此时我们可以使用weave expose 192.168.0.1/24来给weave网桥添加IP,以实现容器与宿主机网络连通。但是,此时在容器内部依然不能访问外部网络。
我们可以同时使用Docker的原生网络和weave网络来实现容器互联及容器访问外网和端口映射。使用外部网络及端口映射的时候就使用docker0网桥,需要容器互联的时候就使用weave网桥。每个容器分配两个网卡。

 IP地址管理(IPAM)
Weave自动为容器分配唯一的IP地址。可通过weave ps查看
 命名和发现
命名的容器自动会注册到Weave DNS中,并可以通过容器名称访问。
 负载均衡
允许注册多个相同名称的容器,Weave DNS随机为每个请求返回地址,提供基本的负载均衡功能。
 手动指定IP地址
docker run –it –e WEAVE_CIDR=10.32.0.100/24 busybox
 动态拓扑
可以在不停止或重新配置剩余Docker主机的情况下添加主机到Weave网络中或从Weave网络中删除
 容错
weave peer不断交换拓扑信息,监视和建立与其他peer的网络连接。如果有主机或网络出现故障,Weave会绕过这个主机,
保证两边容器可以继续通信,当恢复时,恢复完全连接。

test4.OpenvSwitch
什么是OpenVSwich?
OpenvSwich:开放虚拟交换标准,是一种基于开源Apache2.0许可证的多层软件交换机,专门管理多租赁云计算网络环境,支持KVM、Xen等虚 拟化技术。
支持以下功能:
1.支持标准802.1Q VLAN模块的Trunk和access端口模式;
2.QoS(Quality of Service)配置,及管理;
3.支持OpenFlow协议;
4.支持GRE、VXLAN、STT和LISP隧道;
5.具有C和Python接口配置数据库;
6.支持内核态和用户态的转发引擎设置;
7.支持流量控制及监控。

主要组成部分:
ovs-vswitchd 一个实现交换机的守护程序
ovsdb-server 一个轻量级数据库,ovs-vswitchd查询以获取其配置
ovs-dpctl 用于配置交换机的内核模块工具
ovs-vsctl 用于查看和更新ovs-vswitchd的配置工具
ovs-appctl 一个向运行OVS守护程序发送命令的工具
还提供了openflow的工具:
ovs-ofctl 用于查看和控制OpenFlow交换机和控制器
ovs-pki 用于创建和管理公钥
ovs-tcpundump 解析openflow消息

安装部署OVS并建立GRE隧道

节点1:192.168.101.200 容器网段:172.17.1.0/24
节点2:192.168.101.201 容器网段:172.17.2.0/24
1.安装OVS

# apt-get install openvswitch-switch bridge-utils 
2.创建网桥并激活
# ovs-vsctl add-br br0
# ip link set dev br0 up
3.将gre0虚拟接口加入网桥br0,并设置接口类型和对端IP地址(远程IP指定对端)
# ovs-vsctl add-port br0 gre0 -- set Interface gre0 type=gre options:remote_ip=192.168.101.200  
4.添加docker0网桥到OVS网桥br0
# brctl addif docker0 br0
5.查看网桥信息
# ovs-vsctl show
# brctl show
6.添加静态路由
# ip route add 172.17.0.0/16 dev docker0
7.验证互通
# docker run -it busybox

原理图
这里写图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_15800363/article/details/78712262

智能推荐

JWT(Json Web Token)实现无状态登录_无状态token登录-程序员宅基地

文章浏览阅读685次。1.1.什么是有状态?有状态服务,即服务端需要记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行请求的处理,典型的设计如tomcat中的session。例如登录:用户登录后,我们把登录者的信息保存在服务端session中,并且给用户一个cookie值,记录对应的session。然后下次请求,用户携带cookie值来,我们就能识别到对应session,从而找到用户的信息。缺点是什么?服务端保存大量数据,增加服务端压力 服务端保存用户状态,无法进行水平扩展 客户端请求依赖服务.._无状态token登录

SDUT OJ逆置正整数-程序员宅基地

文章浏览阅读293次。SDUT OnlineJudge#include<iostream>using namespace std;int main(){int a,b,c,d;cin>>a;b=a%10;c=a/10%10;d=a/100%10;int key[3];key[0]=b;key[1]=c;key[2]=d;for(int i = 0;i<3;i++){ if(key[i]!=0) { cout<<key[i.

年终奖盲区_年终奖盲区表-程序员宅基地

文章浏览阅读2.2k次。年终奖采用的平均每月的收入来评定缴税级数的,速算扣除数也按照月份计算出来,但是最终减去的也是一个月的速算扣除数。为什么这么做呢,这样的收的税更多啊,年终也是一个月的收入,凭什么减去12*速算扣除数了?这个霸道(不要脸)的说法,我们只能合理避免的这些跨级的区域了,那具体是那些区域呢?可以参考下面的表格:年终奖一列标红的一对便是盲区的上下线,发放年终奖的数额一定一定要避免这个区域,不然公司多花了钱..._年终奖盲区表

matlab 提取struct结构体中某个字段所有变量的值_matlab读取struct类型数据中的值-程序员宅基地

文章浏览阅读7.5k次,点赞5次,收藏19次。matlab结构体struct字段变量值提取_matlab读取struct类型数据中的值

Android fragment的用法_android reader fragment-程序员宅基地

文章浏览阅读4.8k次。1,什么情况下使用fragment通常用来作为一个activity的用户界面的一部分例如, 一个新闻应用可以在屏幕左侧使用一个fragment来展示一个文章的列表,然后在屏幕右侧使用另一个fragment来展示一篇文章 – 2个fragment并排显示在相同的一个activity中,并且每一个fragment拥有它自己的一套生命周期回调方法,并且处理它们自己的用户输_android reader fragment

FFT of waveIn audio signals-程序员宅基地

文章浏览阅读2.8k次。FFT of waveIn audio signalsBy Aqiruse An article on using the Fast Fourier Transform on audio signals. IntroductionThe Fast Fourier Transform (FFT) allows users to view the spectrum content of _fft of wavein audio signals

随便推点

Awesome Mac:收集的非常全面好用的Mac应用程序、软件以及工具_awesomemac-程序员宅基地

文章浏览阅读5.9k次。https://jaywcjlove.github.io/awesome-mac/ 这个仓库主要是收集非常好用的Mac应用程序、软件以及工具,主要面向开发者和设计师。有这个想法是因为我最近发了一篇较为火爆的涨粉儿微信公众号文章《工具武装的前端开发工程师》,于是建了这么一个仓库,持续更新作为补充,搜集更多好用的软件工具。请Star、Pull Request或者使劲搓它 issu_awesomemac

java前端技术---jquery基础详解_简介java中jquery技术-程序员宅基地

文章浏览阅读616次。一.jquery简介 jQuery是一个快速的,简洁的javaScript库,使用户能更方便地处理HTML documents、events、实现动画效果,并且方便地为网站提供AJAX交互 jQuery 的功能概括1、html 的元素选取2、html的元素操作3、html dom遍历和修改4、js特效和动画效果5、css操作6、html事件操作7、ajax_简介java中jquery技术

Ant Design Table换滚动条的样式_ant design ::-webkit-scrollbar-corner-程序员宅基地

文章浏览阅读1.6w次,点赞5次,收藏19次。我修改的是表格的固定列滚动而产生的滚动条引用Table的组件的css文件中加入下面的样式:.ant-table-body{ &amp;amp;::-webkit-scrollbar { height: 5px; } &amp;amp;::-webkit-scrollbar-thumb { border-radius: 5px; -webkit-box..._ant design ::-webkit-scrollbar-corner

javaWeb毕设分享 健身俱乐部会员管理系统【源码+论文】-程序员宅基地

文章浏览阅读269次。基于JSP的健身俱乐部会员管理系统项目分享:见文末!

论文开题报告怎么写?_开题报告研究难点-程序员宅基地

文章浏览阅读1.8k次,点赞2次,收藏15次。同学们,是不是又到了一年一度写开题报告的时候呀?是不是还在为不知道论文的开题报告怎么写而苦恼?Take it easy!我带着倾尽我所有开题报告写作经验总结出来的最强保姆级开题报告解说来啦,一定让你脱胎换骨,顺利拿下开题报告这个高塔,你确定还不赶快点赞收藏学起来吗?_开题报告研究难点

原生JS 与 VUE获取父级、子级、兄弟节点的方法 及一些DOM对象的获取_获取子节点的路径 vue-程序员宅基地

文章浏览阅读6k次,点赞4次,收藏17次。原生先获取对象var a = document.getElementById("dom");vue先添加ref <div class="" ref="divBox">获取对象let a = this.$refs.divBox获取父、子、兄弟节点方法var b = a.childNodes; 获取a的全部子节点 var c = a.parentNode; 获取a的父节点var d = a.nextSbiling; 获取a的下一个兄弟节点 var e = a.previ_获取子节点的路径 vue