(九)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

相关文章
|
23天前
|
Kubernetes Devops 持续交付
DevOps实践:使用Docker和Kubernetes实现持续集成和部署网络安全的守护盾:加密技术与安全意识的重要性
【8月更文挑战第27天】本文将引导读者理解并应用DevOps的核心理念,通过Docker和Kubernetes的实战案例,深入探讨如何在现代软件开发中实现自动化的持续集成和部署。文章不仅提供理论知识,还结合真实示例,旨在帮助开发者提升效率,优化工作流程。
|
16天前
|
Shell Linux Docker
自定义Docker网络
这篇文章介绍了如何使用Docker命令自定义网络,并通过创建和配置网络来实现容器间的通信。
23 6
自定义Docker网络
|
16天前
|
NoSQL 应用服务中间件 Redis
Docker跨宿主机容器通信-通过网络跨宿主机互联
这篇文章介绍了Docker容器跨宿主机通信的实现方法,包括Docker的四种网络模式(host、none、container、bridge)以及如何通过修改网络配置和添加路由规则来实现不同宿主机上的容器之间的互联。
48 0
Docker跨宿主机容器通信-通过网络跨宿主机互联
|
16天前
|
应用服务中间件 nginx Docker
Docker同一台宿主机容器通信-通过容器名称互联
本文详细介绍了如何通过容器名称实现同一宿主机上容器间的互联,并提供了实战案例。首先,文章解释了容器间通过自定义名称访问的原理,随后演示了创建并连接Tomcat与Nginx容器的具体步骤。此外,还讨论了配置中可能出现的问题及解决方案,包括避免硬编码IP地址和使用自定义容器别名来增强系统的灵活性与可维护性。通过这些实践,展示了如何高效地配置容器间通信,确保服务稳定可靠。
22 1
Docker同一台宿主机容器通信-通过容器名称互联
|
6天前
|
网络协议 Linux 应用服务中间件
Socket通信之网络协议基本原理
【9月更文挑战第14天】网络协议是机器间交流的约定格式,确保信息准确传达。主要模型有OSI七层与TCP/IP模型,通过分层简化复杂网络环境。IP地址全局定位设备,MAC地址则在本地网络中定位。网络分层后,数据包层层封装,经由不同层次协议处理,最终通过Socket系统调用在应用层解析和响应。
|
10天前
|
Kubernetes 安全 Docker
|
15天前
|
网络协议 C语言
C语言 网络编程(十一)TCP通信创建流程---服务端
在服务器流程中,新增了绑定IP地址与端口号、建立监听队列及接受连接并创建新文件描述符等步骤。`bind`函数用于绑定IP地址与端口,`listen`函数建立监听队列并设置监听状态,`accept`函数则接受连接请求并创建新的文件描述符用于数据传输。套接字状态包括关闭(CLOSED)、同步发送(SYN-SENT)、同步接收(SYN-RECEIVE)和已建立连接(ESTABLISHED)。示例代码展示了TCP服务端程序如何初始化socket、绑定地址、监听连接请求以及接收和发送数据。
|
15天前
|
网络协议 C语言
C语言 网络编程(十二)TCP通信创建-粘包
TCP通信中的“粘包”现象指的是由于协议特性,发送方的数据包被拆分并在接收方按序组装,导致多个数据包粘连或单个数据包分割。为避免粘包,可采用定长数据包或先传送数据长度再传送数据的方式。示例代码展示了通过在发送前添加数据长度信息,并在接收时先读取长度后读取数据的具体实现方法。此方案适用于长度不固定的数据传输场景。
|
15天前
|
C语言
C语言 网络编程(七)UDP通信创建流程
本文档详细介绍了使用 UDP 协议进行通信的过程,包括创建套接字、发送与接收消息等关键步骤。首先,通过 `socket()` 函数创建套接字,并设置相应的参数。接着,使用 `sendto()` 函数向指定地址发送数据。为了绑定地址,需要调用 `bind()` 函数。接收端则通过 `recvfrom()` 函数接收数据并获取发送方的地址信息。文档还提供了完整的代码示例,展示了如何实现 UDP 的发送端和服务端功能。
|
15天前
|
网络协议 C语言
C语言 网络编程(十)TCP通信创建流程---客户端
在TCP通信中,客户端需通过一系列步骤与服务器建立连接并进行数据传输。首先使用 `socket()` 函数创建一个流式套接字,然后通过 `connect()` 函数连接服务器。连接成功后,可以使用 `send()` 和 `recv()` 函数进行数据发送和接收。最后展示了一个完整的客户端示例代码,实现了与服务器的通信过程。