Weave是weaveworks开发的容器网络解决方案。weave创建的虚拟网络可以将部署在多个主机上的容器连接起来。对于容器来说,weave就像一个巨大的网络交换机,容器可以直接通信,无需NAT和端口映射。除此之外,weave的DNS模块是容器可以通过hostname访问

weave不依赖分布式数据库(例如:consul和etcd)交换网络信息,每个主机上只需要运行weave组件就能建立起跨主机容器网络,weave网络能够穿透防火墙并运行在部分连接的网络上,weave支持加密网络接连,用户可以从一个不受信任的网络连接到主机

weave官网地址: https://github.com/weaveworks/weave

开始部署weave:

1.linux内核版本为3.8以上,dockers版本为1.10.0 or later

2.curl -L git.io/weave -o /usr/local/bin/weave

3.更改权限chmod a+x /usr/local/bin/weave

4。初始化weave:weave  launch

注:初始化weave前要保证有 bridge-utils 网桥工具包

初始化weave三个docker容器来辅助运行,会自动下载镜像

weave:是主程序,负责建立weave网络,收发数据,提供DNS等服务

自动创建网桥

自动创建一个docker网络

driver是weave,subnet是10.32.0.0/12

分析weave的网络结构:

1. eval $(weave env)    设置环境变量,这样通过docker命令行启动的容器就会自动地连接到weave网络中了

可执行 eval  $(weave env --restore)恢复之前的环境

2.docker run --name weave1 -itd busybox    注:-itd连用可使普通镜像运行容器后,容器会保持运行状态

3.查看weave1容器中得网络

weave1容器有两个网络接口:eth0@if18,从他的IP可以看出是与host上得docker0同属一个网段,所以还是默认连接在docker0上得

还有一个ethwe@if20,从名称可以看出ethew与weave相关,他的对应编号是20,我们从host上面通过ip link进行查看

vethwep120768@if19是与ethwe是一对veth pair,而且被挂在了weave上

我们通过ip -d link深入分析一下现在host上得网络

这里出现了很多新得interface

datapath:是一个openvswitch

vethwe-datapath@vethwe-bridge:是veth pair

vethwe-datapath:父设备是datapath

vxlan-6784:是vxlan interface,其maste也是datapath,weave主机之间通过Vxlan节能型通信

host1得网络结构如下:盗图

weave网络包含两个虚拟交换机:桥接的weave和openvswitch datapath,veth pair :vethwe-bridge将两者连接在一起。

weave与datapath分工不同,weave负责将容器接入weave网络,datapath负责在主机间建立vxlan隧道并收发数据

我们再运行一个容器

查看weave1的hostname1

weave DNS为容器创建了默认域weave1.weave.local

可以ping通

Weave的连通性和隔离性

1.之前我们是在docker1上进行的操作,现在我们在docker2上进行同样的部署weave

2.启动weave

这里必须指定IP 192.168.7.235这样docker1和docker2才能加到同一个网络

设置环境变量,在docker2上运行容器

eval $(weave env)

docker run -itd --name weave11 busybox

docker2上面的weave11能够ping通docker1上的weave1

docker1上面的weave1的IP是10.32.0.1/12

docker2上的weave11的IP 是10.44.0.0/12

掩码是12位的,实际上这个两个IP 是在同一个subnet10.32.0.0/12.通过docker1和docker2之间的vxlan隧道,2个容器逻辑上在一个LAN中,肯定是能ping通的

盗图

1.数据包的目的地址是10.32.0.1/12,docker2根据路由表,从ethwe发送出去

2.docker2查询到目的主机,将数据通过vxlan发送给docker1

3.docker1收到数据,根据目的IP将数据转发给weave1

weave的网络隔离

默认配置下,weave使用一个大subnet(例如10.32.0.0/12),所有主机的容器都从这个地址空间中分配IP ,因为同属一个subnet,容器可以直接通信。如果要实现网络隔离,可以通过换环境变量WEAVE_CIDR为容器分配不同的subnet的IP

注:如果通过-e WEAVE_CIDR ,进入容器后没有使用新的网段,那么重新设置一下变量 eval $(weave env)

容器分配到的IP 是10.32.2.128/24,无法ping通10.32.0.1

weave如何与外部进行通信

weave是一个私有的xvlan网络,默认与外部网络隔离。外部如何才能访问到weave中的容器呢?

方法是:

1.首先将主机加入到weave网络

2.然后把主机当作访问weave网络的网关。

要将主机加入到weave,执行weave expose

这个ip10.32.0.6会被配置到host上的weave的网桥上

现在docker1的网络是,如盗图:

weave网桥位于root namespace,它负责将容器接入weave网络。给weave配置同一subnet的IP其本质就是将docker1接入weave网络。docker1现在已经可以直接与同一weave网络接入容器通信了,无论容器是否在docker1上

在docker1上ping同一个host上的容器

pingdocker2上的容器

下面我们看一下,如果host主机没有加入到weave网络,是否能ping通自己主机上的容器?

进入docker2上

没有加入到weave网络的主机 也无法ping通自己主机上的容器。如果是部署了weave服务可以直接通过weave expose加入到weave网络,如果没有部署weave网络的主机如何与容器进行通信呢?

方法是:将非weave主机的网关指向docker1

如:像docker主机添加路由

测试后可以ping通

使用weave网络,容器是如何方位外网的呢?

我们可以观察到在weave环境下,我们运行的容器出本地网卡外都有两个网卡,eth0和weave,我们知道这个eth0是连接docker0用的,所以容器访问外网就是通过docker0实现的

IPAM:

我们在每个主机上通过weave launch使weave获得subnet后,发现都是10.32.0.0/12网段的,我们也可以自定义subnet,可以通过--ipalloc-range分配特定的subnet

weave launch --ipalloc-range 10.2.0.0/16

但是一定要确保每个主机都使用相同的subnet

centos7下安装docker(15.6docker跨主机网络---Weave)的更多相关文章

  1. centos7下安装docker(12.2自定义网络)

    通常默认的情况下我们使用的是docker的bridge的网络,用户也可以根据自己的业务需要,创建user-defined docker 提供三种user-defined网络驱动:bridge,over ...

  2. docker(一) Centos7下安装docker

    docker(一) Centos7下安装dockerdocker(二) windows10下安装dockerdocker(三) 镜像和容器常用命令 docker(四) 使用Dockerfile构建镜像 ...

  3. CentOS7下安装docker(Docker系列1)

    CentOS7下安装docker 系统要求 为了安装docker,需要准备 64-bit的CentOS 7 删除非官方的Docker包 yum的仓库中有一个很旧的Docker包, 现在Docker官方 ...

  4. centos7下安装docker与镜像加速

    1.背景 centos7下安装docker 2.安装 第一步:检查是否为centos7版本 第二步:依赖环境安装 执行如下两个命令: yum -y install gcc yum -y install ...

  5. centos7下安装docker(15.2跨主机网络-overlay)

    为支持容器跨主机通信,Docker提供了overlay driver,使用户可以创建基于VxLAN的overlay网络.VxLAN可将二层数据封装到UDP进行传输,VxLAN提供与VLAN相同的以太网 ...

  6. centos7 下安装docker报错:You could try using...

    搞了台VPS,想要装docker,发现死活装不上,各种报错.之前系统是centos6,发现官方现在已经不支持centos6了,遂升级到centos7,然后还是出现下面这个错误. Error: Pack ...

  7. Docker系列04—跨主机网络方案(overlay/weave)

    在前面详细讲解了几种网络模式:none,host,bridge,container.他们解决了单个主机间的容器的通信问题,并不能实现多个主机容器之间的通信. 跨主机网络方案包括两大类: 1,docke ...

  8. centos7下安装docker(15.4跨主机网络-flannel)

    flannel是CoreOS开发的容器网络解决方案,flannel为每一个host分配一个subnet,容器从这些subnet中分配IP,这些IP可以在host之间路由,容器无需NAT和port ma ...

  9. centos7下安装docker(15.5容器跨主机网络--flanneld)

    flannel是由CoreOS研究的一种覆盖网络(overlay network)网络工具,目的是帮助每一个host主机有一个完整的子网: 功能是:让集群中不同节点的主机创建的容器都有一个唯一的虚拟I ...

随机推荐

  1. Hibernate入门(一)

    1.导包 导入Hibernate最基本的包(不要忘记导入数据库驱动包了!) 下载文件名为黄色框框中的名称的压缩包在对应路径下,有个required包下的所有包就是必备的基本包 2.建表 USE TES ...

  2. Java并发编程-Semaphore

    基于AQS的前世今生,来学习并发工具类Semaphore.本文将从Semaphore的应用场景.源码原理解析来学习这个并发工具类. 1. 应用场景 Semaphore用来控制同时访问某个特定资源的操作 ...

  3. jquery网页日历显示控件calendar3.1使用详解

    关于日历插件,我做了好多次尝试,一直致力于开发一款简单易用的日历控件.我的想法是争取在引用这个控件后,用一行js代码就能做出一个日历,若在加点参数,就能自定义外观和功能丰富多彩的日历.Calendar ...

  4. frontpage 2010.2003绿色版

    基本简介 frontpage网页设计软件是微软公司出品的一款网站制作入门级软件.frontpage制作网站软件使用方便简单,会用Word就能做网页,微软在2006年年底前将停止提供FrontPage软 ...

  5. Go开发之路 -- Go语言基本语法

    一. 变量 1.1 变量的声明 Go 语言的每一个变量都拥有自己的类型,必须经过声明才能开始用. 标准格式: var 变量名 变量类型 变量的声明以关键字 var 开头,行尾不需要写分号 常见变量的数 ...

  6. margin:0 auto是什么意思

    一.margin设置对象外边距 二.margin后面如果只有两个参数的话,第一个表示top和bottom,第二个表示left和right 因为0 auto

  7. 包含min函数的栈 ,二叉树的镜像

    包含min函数的栈 问题 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 代码 # -*- coding:utf-8 -*- class Sol ...

  8. 《JavaScript高级程序设计》笔记:变量、作用域和内存问题(四)

    基本类型和引用类型的值 ECMAScript变量可能包含两种不同数据类型的值:基本类型值和引用类型值.基本类型值指的是简单的数据段,而引用类型的值指那些可能有多个值构成的对象. 动态的属性 var p ...

  9. meta、link、script的常用写法

    meta 设置编码格式 <meta charset='utf-8'> 设置关键字 <meta name="keywords" content="音乐 播 ...

  10. GeoServer中使用样式化图层描述符(sld)给WMS加注记

    现有一个shp格式的道路注记文件,用点来表示注记的位置,属性表中保存每个点对应的字,在QGIS中打开如下图所示 它的属性表如下 现需要把道路数据和它的注记发布为WMS服务,通过GeoServer直接发 ...