docker网络原理笔记

本文深入探讨Docker网络模型,重点介绍桥接、host、overlay和macvlan驱动。详细讲解了Docker如何使用VXLAN创建覆盖网络,实现跨主机容器通信,包括VXLAN的工作原理和示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

docker 网络,使用的是CNM 网络模型方案。 libnetwork是对CNM的实现, 提供docker核心网络架构的全部功能

Docker的网络子系统是可插拔的,使用驱动程序。默认情况下存在多个驱动程序,并提供核心网络功能:

bridge:默认网络驱动程序。如果未指定驱动程序,则这是您要创建的网络类型。当您的应用程序在需要通信的独立容器中运行时,通常会使用桥接网络。
host:对于独立容器,删除容器和Docker主机之间的网络隔离,并直接使用主机的网络。host 仅适用于Docker 17.06及更高版本的swarm服务
overlay:覆盖网络将多个Docker守护程序连接在一起,并使群集服务能够相互通信。您还可以使用覆盖网络来促进群集服务和独立容器之间的通信,或者在不同Docker守护程序上的两个独立容器之间进行通信。此策略消除了在这些容器之间执行OS级别路由的需要。
macvlan:Macvlan网络允许您为容器分配MAC地址,使其显示为网络上的物理设备。Docker守护程序通过其MAC地址将流量路由到容器。macvlan 在处理期望直接连接到物理网络的传统应用程序时,使用驱动程序有时是最佳选择,而不是通过Docker主机的网络堆栈进行路由。

none:对于此容器,禁用所有网络。通常与自定义网络驱动程序一起使用。none不适用于群组服务

  1. 单机桥接:

linux Docker 创建单机桥接网络采用内置的桥接驱动,而 Windows Docker 创建时使用内置的 NAT 驱动

在Linux 上网络名称为 bridge

查看:

[root@docker1 docker]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
5c3bb6e979f5        bridge              bridge              local
3f3eb1511ddd        host                host                local
3db9e188251c        none                null                local

查看详情:

[root@docker1 docker]# docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "5c3bb6e979f54af8e7001a9a8d35647a657cb8fb7d610180214b782fb28bb9b2",
        "Created": "2019-08-10T05:10:14.092819245-04:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
         ....
         ....
[root@docker1 docker]# docker network inspect bridge | grep bridge.name
            "com.docker.network.bridge.name": "docker0",
[root@docker1 docker]# 

可以看到默认情况 brige网络映射到 docker0

查看网桥:

brctl 工具来查看系统中的 Linux 网桥

[root@docker1 docker]# brctl show
bridge name     bridge id               STP enabled     interfaces
docker0         8000.02421fadc487       no              veth99d9308
[root@docker1 docker]# 

端口映射允许将某个容器端口映射到docker主机端口上

  1. Macvlan

为容器提供 MAC 和 IP 地址 ,将容器直接与物理网络连接:
在这里插入图片描述

macvlan需要将物理网络设置为混杂模式, 即网络需要配置为trunck模式

接入物理网络需要在网络上进行打标签
在这里插入图片描述

将容器连接到vlan100的网络上,为其打上目标 VLAN 网络对应的 ID

Docker Swarm 支持两种服务发布模式,两种模式均保证服务从集群外可访问。

  • Ingress模式(默认), 可以通过集群内任意一个node节点访问容器服务。
  • Host模式, 只能是运行容器副本的该node节点才能访问容器服务。

区别图:
在这里插入图片描述

Ingress 模式采用名为 Service Mesh 或者 Swarm Mode Service Mesh 的四层路由网络来实现

在这里插入图片描述

如果容器服务存在多个副本,则流量会被平均分发到不同的副本上

在这里插入图片描述

覆盖网络:

Docker 支持覆盖网络, 基于 Libnetwork 和驱动进行实现, docker也提供Overlay原生驱动支持

原理:

Docker 使用 VXLAN 隧道技术创建了虚拟二层覆盖网络

VXLAN 的设计中,允许用户基于已经存在的三层网络结构创建虚拟的二层网络

在前面的示例中创建了一个子网掩码为 10.0.0.0/24 的二层网络,该网络是基于一个三层 IP 网络实现的,三层 IP 网络由 172.31.1.0/24 和 192.168.1.0/24 这两个二层网络构成
在这里插入图片描述

VXLAN 的美妙之处在于它是一种封装技术,能使现存的路由器和网络架构看起来就像普通的 IP/UDP 包一样,并且处理起来毫无问题。

为了创建二层覆盖网络,VXLAN 基于现有的三层 IP 网络创建了隧道。小伙伴可能听过基础网络(Underlay Network)这个术语,它用于指代三层之下的基础部分。

VXLAN 隧道两端都是 VXLAN 隧道终端(VXLAN Tunnel Endpoint, VTEP)。VTEP 完成了封装和解压的步骤,以及一些功能实现所必需的操作,如下图所示。
在这里插入图片描述

每个主机运行了一个容器,之后又为容器连接创建了一个 VXLAN 覆盖网络。

为了实现上述场景,在每台主机上都新建了一个 Sandbox(网络命名空间)。正如前文所讲,Sandbox 就像一个容器,但其中运行的不是应用,而是当前主机上独立的网络栈。

在 Sandbox 内部创建了一个名为 Br0 的虚拟交换机(又称做虚拟网桥)。同时 Sandbox 内部还创建了一个 VTEP,其中一端接入到名为 Br0 的虚拟交换机当中,另一端接入主机网络栈(VTEP)。

在主机网络栈中的终端从主机所连接的基础网络中获取到 IP 地址,并以 UDP Socket 的方式绑定到 4789 端口。不同主机上的两个 VTEP 通过 VXLAN 隧道创建了一个覆盖网络,如下图所示。
在这里插入图片描述

每个容器都会有自己的虚拟以太网(veth)适配器,并接入本地 Br0 虚拟交换机。目前拓扑结构如下图所示,虽然是在主机所属网络互相独立的情况下,但这样能更容易看出两个分别位于不同主机上的容器之间是如何通过 VXLAN 上层网络进行通信的。

在这里插入图片描述

示例:

将 node1 上的容器称为 C1,node2 上的容器称为 C2,如下图所示。假设 C1 希望 ping 通 C2

在这里插入图片描述

C1 发起 ping 请求,目标 IP 为 C2 的地址 10.0.0.4。该请求的流量通过连接到 Br0 虚拟交换机 veth 接口发出。虚拟交换机并不知道将包发送到哪里,因为在虚拟交换机的 MAC 地址映射表(ARP 映射表)中并没有与当前目的 IP 对应的 MAC 地址。

所以虚拟交换机会将该包发送到其上的全部端口。连接到 Br0 的 VTEP 接口知道如何转发这个数据帧,所以会将自己的 MAC 地址返回。这就是一个代理 ARP 响应,并且虚拟交换机 Br0 根据返回结果学会了如何转发该包。接下来虚拟交换机会更新自己的 ARP 映射表,将 10.0.0.4 映射到本地 VTEP 的 MAC 地址上。

现在 Br0 交换机已经学会如何转发目标为 C2 的流量,接下来所有发送到 C2 的包都会被直接转发到 VTEP 接口。VTEP 接口知道 C2,是因为所有新启动的容器都会将自己的网络详情采用网络内置 Gossip 协议发送给相同 Swarm 集群内的其他节点。

交换机会将包转发到 VTEP 接口,VTEP 完成数据帧的封装,这样就能在底层网络传输。具体来说,封装操作就是把 VXLAN Header 信息添加以太帧当中。

VXLAN Header 信息包含了 VXLAN 网络 ID(VNID),其作用是记录 VLAN 到 VXLAN 的映射关系。每个 VLAN 都对应一个 VNID,以便包可以在解析后被转发到正确的 VLAN。

封装的时候会将数据帧放到 UDP 包中,并设置 UDP 的目的 IP 字段为 node2 节点的 VTEP 的 IP 地址,同时设置 UDP Socket 端口为 4789。这种封装方式保证了底层网络即使不知道任何关于 VXLAN 的信息,也可以完成数据传输。

当包到达 node2 之后,内核发现目的端口为 UDP 端口 4789,同时还知道存在 VTEP 接口绑定到该 Socket。所以内核将包发给 VTEP,由 VTEP 读取 VNID,解压包信息,并根据 VNID 发送到本地名为 Br0 的连接到 VLAN 的交换机。在该交换机上,包被发送给容器 C2。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值