十、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

智能推荐

java 实现文件下载功能(浏览器提示保存位置)_java文件下载时如何可以弹出下载框选择路径-程序员宅基地

文章浏览阅读2.5k次。@RequestMapping(params = "down") public void down(HttpServletResponse response,@RequestParam("file") String file) { try { String filePath = "E:\\saveWenJian\\"+file; InputStream is = new FileInputStream(filePath); response.reset(); // 必要地清除res._java文件下载时如何可以弹出下载框选择路径

java中实现类似C#的TrimEnd函数_java trimend-程序员宅基地

文章浏览阅读2.6k次,点赞4次,收藏2次。话不多说,直接上代码/* * 删除末尾字符串 */public static String trimend(String inStr, String suffix) { while(inStr.endsWith(suffix)){ inStr = inStr.substring(0,inStr.length()-suffix.length()); } return inStr;}public static void main(String[] ar._java trimend

Java 中HashMap 详解_java hashmap-程序员宅基地

文章浏览阅读2.2w次,点赞13次,收藏53次。举一个简单的例子,假设我们在目前的平台有键值对 key1-value1,计算出key1的hash为1, 计算后存在table数组中下标为1的地方,假设table被序列化了,并传输到了另外的平台,并反序列化为了原来的HashMap,key1-value1仍然存在下标1的位置,当在这个平台运行get("key1")的时候,可能计算出key1的hash为2,就有可能到下标为2的地方去找该元素,这样就出错了。创建新的Node数组,将原来数组中的元素重新映射到新的数组中。2. 数组的默认长度是16。_java hashmap

Codeigniter教程_编程入门自学教程_菜鸟教程-免费教程分享_codeingiter-程序员宅基地

文章浏览阅读245次。CodeIgniter 是一套给 PHP 网站开发者使用的应用程序开发框架和工具包。它提供单的接口和逻辑结构,其目的是使开发人员更快速地进行项目开发。使用 CodeIgniter可以减少代码的编写量,并将你的精力投入到项目的创造性开发上。CodeIgniter入门教程。_codeingiter

html5清除画布代码,清除HTML5 Canvas中的圆形区域-程序员宅基地

文章浏览阅读267次。Daniel Kapla..9鉴于要求,这些答案都很好.但是,让我们说你和我一样,你有额外的要求:您想要"清除"可能部分超出您正在清除的形状范围的形状的一部分.您希望在形状下方看到背景而不是清除背景.对于第一个要求,解决方案是使用context.globalCompositeOperation = 'destination-out' 蓝色是第一个形状,红色是第二个形状.如您所见,destinat..._canvas删除已画的圆形

Ubuntu下使用cholmod求解稀疏矩阵_libcholmod.so.3-程序员宅基地

文章浏览阅读7.4k次。 首先自我检讨一下,自从第一篇文章到现在将近两个月的时间没有写了,惭愧阿。项目也搁置了一段时间,现在准备接着做,由于要确定可行性,所以要把我认为最难的问题确定下是否可以解决。网格的数据结构可以使用openmesh,现在最难的就是数值计算的部分,在windows下我使用了cholmod(不了解的可以google下什么是cholmod)作为稀疏矩阵运算的库,所以理所应当在linux首选肯定也是它。下面就简单说一下如何安装cholmod。 其实在ubuntu下开发比win_libcholmod.so.3

随便推点

echarts柱状图刻度_echarts中柱状图的刻度问题-程序员宅基地

文章浏览阅读2.1k次。想实现一个柱状图,表示范围的数值以下是option的代码option = {color: ['#3398DB'],tooltip : {trigger: 'axis',axisPointer : { // 坐标轴指示器,坐标轴触发有效type : 'shadow' // 默认为直线,可选为:'line' | 'shadow'}},grid: {left: '3%..._echarts柱状图 控制刻度

oracle备份或还原数据库(expdp、impdp)_oracle更改expdp数据备份逻辑目录路径-程序员宅基地

文章浏览阅读1.2k次。1.首先新建或更改虚拟目录因为数据泵方式——expdp(导出)和impdp(导入)需要虚拟目录路径。-- 语法create or replace directory 虚拟目录名 as '虚拟目录绝对路径';-- 例子:创建或修改data_backup逻辑目录create or replace directory data_backup as 'D:\app\Administrator\admin\bysjdb\dbdump\20210709';如果是第一次新建data_backup这个逻辑目录_oracle更改expdp数据备份逻辑目录路径

Ubuntu18.04/18.10更换图标主题_ubuntu 修改 图标主题 函数-程序员宅基地

文章浏览阅读1.1w次。测试系统:ubuntu18.04 64bits(下载地址) ubuntu18.10 64bits(下载地址) 环境:Win10,Oracal VM VisualBox虚拟机最近一个比较热门的主题是Yaru社区主题,已经支持ubuntu18.04和18.10版本了,下面简单记录一下修改该主题的方法,测试是在虚拟机完成的,同样适用于真正安装的ubuntu18.04/18.10。(1..._ubuntu 修改 图标主题 函数

php学习日记第六棒(PHP 开发环境的搭建)_please select the default characterset-程序员宅基地

文章浏览阅读405次。1- 在 Windows 环境下搭建Windows + Apache(IIS)+ MySQL + PHP + PHPMyadmin = wamp2- 在 Linux 环境下搭建 Linux + Apache + MySQL + PHP = lamp;Windows下安装1-套件安装如:appserver、xampp等,集成了 apache + mysql + php + phpmy_please select the default characterset

Android 怎么旋转TextView文字显示方向_android 文字侧翻90度-程序员宅基地

文章浏览阅读1.1w次。在一个项目中,需要旋转TextView的文字显示方向,怎么实现呢?这里提供一种变通的方法来实现该功能:Animation动画,保存动画结束状态来实现该功能。主要代码如下:1、定义一个anim xml资源文件rotate_right.xml<_android 文字侧翻90度

达人评测 机械革命F6怎么样-程序员宅基地

文章浏览阅读627次。机械革命Forza系列轻薄本全系都采用了轻量化的镁合金机身,在F6身上还进行了工艺升级,提升颜值的同时显著提高了表面耐磨性能机械革命F6怎么样这些点很重要http://www.adiannao.cn/dy黑白成搭配的Forza铭牌位于机身A面的边缘,在图灵灰色机身的映衬下显得格外醒目,也更加符合年轻人的审美。外观方面,机械革命F6的A面和C面采用航空级镁铝合金材质打造,机身重量轻至1.5kg。拥有包括雷电4在内种类丰富的接口。电池容量可达70Wh,续航时间长达14个小时。配置方面,...

推荐文章

热门文章

相关标签