(九)Docker网络以及跨宿主机通信

简介: 讲在前面:1.目前实现的是单机部署,如何创建镜像,管理镜像;如何创建容器,管理容器;如何快速创建docker虚拟主机machine,如何快速部署多组件项目compose以及如何跨宿主机建立集群swarm。

讲在前面:
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

image

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网络。
image

image
image

image

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

原理图
image

相关文章
|
16天前
|
负载均衡 网络协议 开发者
掌握 Docker 网络:构建复杂的容器通信
在 Docker 容器化环境中,容器间的通信至关重要。本文详细介绍了 Docker 网络的基本概念和类型,包括桥接网络、宿主网络、覆盖网络和 Macvlan 网络等,并提供了创建、管理和配置自定义网络的实用命令。通过掌握这些知识,开发者可以构建更健壮和灵活的容器化应用,提高应用的可扩展性和安全性。
|
14天前
|
安全 量子技术 数据安全/隐私保护
量子通信:构建安全通信网络的未来
【9月更文挑战第21天】量子通信作为信息时代的一次伟大飞跃,正引领我们迈向一个全新的安全通信纪元。其独特的绝对安全性、高效率和大容量特点,使得量子通信在构建未来安全通信网络中具有不可替代的作用。随着技术的不断发展和应用的不断拓展,我们有理由期待量子通信将在未来发挥更加重要的作用,为人类社会的信息安全保驾护航。
67 13
|
10天前
|
存储 Docker 容器
Docker中容器间的通信方式有哪些13
Docker中容器间的通信方式有哪些13
14 4
|
22天前
|
网络协议 Linux 应用服务中间件
Socket通信之网络协议基本原理
【9月更文挑战第14天】网络协议是机器间交流的约定格式,确保信息准确传达。主要模型有OSI七层与TCP/IP模型,通过分层简化复杂网络环境。IP地址全局定位设备,MAC地址则在本地网络中定位。网络分层后,数据包层层封装,经由不同层次协议处理,最终通过Socket系统调用在应用层解析和响应。
|
26天前
|
Kubernetes 安全 Docker
|
5天前
|
网络协议 安全 开发者
掌握 Docker 网络:构建复杂的容器通信
在 Docker 容器化环境中,容器间的通信至关重要。本文详细介绍了 Docker 网络的基础知识,包括网络驱动、端口映射和命名等核心概念,并深入探讨了 Bridge、Host、Overlay 和 Macvlan 四种网络类型的特点及应用场景。此外,还提供了创建、连接、查看和删除自定义网络的命令示例,以及高级网络配置方法,如网络命名空间、DNS 解析和安全通信配置,帮助开发者构建更健壮的容器化应用。
|
1月前
|
网络协议 C语言
C语言 网络编程(十一)TCP通信创建流程---服务端
在服务器流程中,新增了绑定IP地址与端口号、建立监听队列及接受连接并创建新文件描述符等步骤。`bind`函数用于绑定IP地址与端口,`listen`函数建立监听队列并设置监听状态,`accept`函数则接受连接请求并创建新的文件描述符用于数据传输。套接字状态包括关闭(CLOSED)、同步发送(SYN-SENT)、同步接收(SYN-RECEIVE)和已建立连接(ESTABLISHED)。示例代码展示了TCP服务端程序如何初始化socket、绑定地址、监听连接请求以及接收和发送数据。
|
1月前
|
网络协议 C语言
C语言 网络编程(十二)TCP通信创建-粘包
TCP通信中的“粘包”现象指的是由于协议特性,发送方的数据包被拆分并在接收方按序组装,导致多个数据包粘连或单个数据包分割。为避免粘包,可采用定长数据包或先传送数据长度再传送数据的方式。示例代码展示了通过在发送前添加数据长度信息,并在接收时先读取长度后读取数据的具体实现方法。此方案适用于长度不固定的数据传输场景。
|
1月前
|
网络协议 C语言
C语言 网络编程(十)TCP通信创建流程---客户端
在TCP通信中,客户端需通过一系列步骤与服务器建立连接并进行数据传输。首先使用 `socket()` 函数创建一个流式套接字,然后通过 `connect()` 函数连接服务器。连接成功后,可以使用 `send()` 和 `recv()` 函数进行数据发送和接收。最后展示了一个完整的客户端示例代码,实现了与服务器的通信过程。
|
3天前
|
安全 网络协议 网络安全
网络安全与信息安全:漏洞、加密与意识的三重奏
【9月更文挑战第32天】在数字世界的交响乐中,网络安全是那不可或缺的乐章。本文将带您深入探索网络安全的三大主题:网络漏洞的识别与防范、加密技术的奥秘以及安全意识的重要性。通过深入浅出的方式,我们将一起揭开这些概念的神秘面纱,并学习如何在实际生活中应用它们来保护自己的数字足迹。让我们开始这场既刺激又富有教育意义的旅程,提升个人和组织的网络安全防御能力。
下一篇
无影云桌面