☰
Docker网络续集:穿越Bridge、隧道Overlay、直连Macvlan,构建云原生通信矩阵!
2026/10/27 1:18:54 网站建设 项目流程

文章目录

  • 本篇摘要
  • 一.docker 网络分类
    • overlay网络
    • MACVLAN网络
    • IPVLAN网络
  • 二.网络查询实战操作
    • docker bridge 的 veth pair 的连接情况查看操作
    • 容器与宿主机/外界主机通信原理
      • ​​Docker容器网络与NAT技术​
    • 容器与宿主机外部如何打通
      • iptables简单介绍
    • 容器的网络命名空间查找
      • nsenter介绍
  • 三.本篇小结

本篇摘要

本文深入解析Docker四大网络模式(Bridge/Host/Container/None),重点剖析Overlay、Macvlan、IPVLAN的实现原理与跨主机通信机制,并通过veth pair、网桥、iptables NAT实战演示容器内外网络流量走向。

一.docker 网络分类

之前在docker网络部分介绍了对应的bridge host container none网络;这里就不在介绍;下面重点说下对应的overlay网络。

overlay网络

  • 为了解决跨主机的容器通信问题,让运行在不同物理机器上的Docker容器能够像在同一个局域网内一样直接通信,因此引入了overlay网络类型。

实现原理:

  • 在不改变底层物理网络的情况下,通过一种“隧道”技术(如VXLAN),将容器原始的二层数据包封装在UDP/IP报文里,利用现有IP网络进行传输(可以发现创建overlay网络后对应的bridge网络自动变成了docker_gebridge)。

主要优势:

  • 透明性:对应用程序和底层网络设施都是透明的,无需修改。
  • 安全性:支持对传输的消息进行加密(比如在overlay网络层操作)。
  • 高效性:消除了在容器之间进行复杂操作系统级路由的需要。

典型应用:

  • 它是Docker Swarm等容器编排工具实现多主机网络的主流方案,也是构建大规模云数据中心网络的基础技术(如VXLAN)。

一句话:Overlay网络是一种通过“包中包”的隧道技术,在现有IP网络上构建出大规模虚拟二层网络,从而实现容器跨主机直接通信的解决方案。

overlay网络创建指令如下:

dockernetwork create-doverlay ovnet1

MACVLAN网络

为每个容器的虚拟网卡分配一个真实的MAC地址,让容器在网络层面上等同于一台直接连接在物理网络中的真实主机。

关键优势:

性能极高:容器流量直接通过物理网卡进出,完全绕过了宿主机的协议栈和虚拟网桥(如docker0),减少了中间损耗。

网络隔离:可以使用不同的物理接口为不同的Macvlan网络提供连接,实现网络隔离。

必要配置:

创建Macvlan网络时,必须在Docker主机上指定三个参数:

  • 用于连接的物理接口(如eth0)
  • 所在的子网网段
  • 出口的网关地址

重要前提:

  • 必须将指定的物理网卡(如eth0)开启混杂模式(promiscuous mode),命令为:ifconfig eth0 promisc。这是为了让该网卡能够接收目的MAC地址为所有容器(而非仅宿主机本身)的网络帧。

一句话:Macvlan是一种高性能网络方案,它通过为容器分配独立MAC地址并让其直接借用物理网卡通信,使容器变成物理网络中的“一等公民”。

overlay网络创建指令如下:

dockernetwork create-dmacvlan--subnet=172.16.10.0/24 --gateway=172.16.10.1-oparent=eth0 mac1

IPVLAN网络

核心功能:

  • IPVLAN 是一种网络技术,用于实现不同主机上的容器之间直接通信。

工作模式特点:

  • 它让所有容器都处于同一个二层网络(同一个网段/VLAN)中,就像都连接在同一个物理交换机上一样。

跨网段通信方式:

  • 通过创建不同的子接口并关联到不同的三层网络(网段),来实现不同IPVLAN网络(即不同网段)间的容器通信。

与Overlay技术的对比:

  • Overlay网络(如VXLAN)天生就是为了解决跨三层IP网络构建虚拟二层网络的问题,而IPVLAN最初更侧重于在同一二层域内提供高性能的网络解决方案。

一句话:IPVLAN是一种让容器像在同一台交换机下一样直接通信的技术,通过子接口实现跨网段互联,与Overlay的“隧道”技术路线不同。

overlay网络创建指令如下:

dockernetwork create-dipvlan--subnet=192.168.1.0/24 --gateway=192.168.1.1-oipvlan_mode=l2-oparent=eth0 pub_net

二.网络查询实战操作

docker bridge 的 veth pair 的连接情况查看操作

  • 首先启动对应的busybox容器。

  • 进入容器查看网卡情况;可以看到存在一个veth的网卡对;然后内部是eth0网卡通过1721网线拉到宿主机。

  • 退出容器查看对应的这网线的另一头的网卡编号;然后去对应的docker0的linux bridge 发现确实被插上了(容器通过veth对借助网桥进行通信;包括对内与对外)。

容器与宿主机/外界主机通信原理

​​Docker容器网络与NAT技术​

  1. Bridge模式:

    通过veth pair和Network Namespace技术,Docker 实现了容器与宿主机及外部的网络连通。

  2. NAT技术

    由于容器(veth pair)的IP与宿主机IP不在同一网段,导致外部网络无法直接发现或通过容器IP访问其内部服务; Docker 采用NAT(网络地址转换)技术,让外部网络能够主动将数据包发送到容器内部。

  3. 端口绑定:

    容器内的服务监听自身的IP和端口(port_0),Docker 通过 NAT 将此端口与宿主机的某个端口(port_1)进行“绑定”或映射。这样,外部访问宿主机port_1的流量就会被自动转发到容器内部的port_0。

一句话:Docker通过NAT技术,将容器内部的端口与宿主机端口进行映射,解决了外部网络无法直接访问隔离容器的问题。

容器与宿主机外部如何打通

  1. 外界访问容器(入方向):
  • 通过DNAT(目标地址转换)实现。
  • 外部请求访问宿主机IP:端口,宿主机根据DNAT规则将其目的IP和端口改写为容器的IP和端口,并通过veth pair将请求转发给容器内服务。
  1. 容器访问外界(出方向):

  • 通过SNAT(源地址转换)实现。
  • 容器发出的请求,其源IP是容器IP。请求经veth pair和网桥到达宿主机后,宿主机根据SNAT规则将其源IP改写为宿主机IP,再发往外网。
  1. 响应报文如何返回容器:
  • 关键靠conntrack(连接跟踪)机制,而非DNAT。
  • 对于已建立的连接(ESTABLISHED)或相关连接(RELATED)的响应报文,宿主机能自动识别并将其直接返回给原始的容器,无需额外配置端口映射。
  1. 核心依赖:
  • veth pair:连接容器与宿主机网桥的“虚拟网线”。
  • 网桥(docker0):充当容器网络的虚拟交换机。
  • IP转发:需开启宿主机内核的IP转发功能(/proc/sys/net/ipv4/ip_forward),宿主机才能为容器转发数据包。

一句话:Docker通过DNAT让外界能访问容器,通过SNAT让容器能访问外界,依靠连接跟踪机制确保响应报文正确返回。

iptables简单介绍

  1. 核心功能:

    iptables 是 Linux 系统自带的免费包过滤防火墙,主要用于实现封包过滤、重定向和网络地址转换(NAT)等核心安全功能。

  2. 四张功能表:

    • filter 表:最常用,负责基础包过滤,决定数据包是否允许通过。
    • nat 表:负责网络地址转换(如SNAT、DNAT),用于共享上网或端口映射。
    • mangle 表:用于修改数据包内容(如TTL)。
    • raw 表:用于连接跟踪前的数据包处理。
  3. 常用命令参数:

    • -t:指定要操作的表(如 filter、nat)。
    • -L:列出指定链中的所有规则。
    • -n:以数字形式显示IP和端口,加速解析。
    • -v:显示详细信息,如数据包计数。

一句话:iptables 通过四张表(filter/nat/mangle/raw)和一系列规则链,构成了Linux系统的核心防火墙,用以控制网络流量和实现地址转换。

下面通过nat表来验证下上面结论:

  • 这里伪装规则说了只要不是从docker出来的也就是从容器出来的;它的ip符合对应的docker0桥规定ip 无论目的ip等是啥都会遵守这个伪装规则。

  • 添加对应NGINX容器;理应说是可以外界ip访问进容器的。

  • 这里再次查看发现对应的DNAT转化生效;把对应的只要不是从docker0桥进来的(也就是访问容器的)无论源目的ip是啥;都会被自动转化成对应容器的虚拟ip+port(这样就完成了正向访问)。

容器的网络命名空间查找

nsenter介绍

  1. 命令用途:nsenter命令用于进入指定进程(尤其是容器)的命名空间,从而使用宿主机的网络工具(如ip、ping)调试容器内部网络,解决容器内缺少基础命令的问题。
  2. 核心功能:通过参数进入不同类型的命名空间(如网络、PID、挂载等),最常用的是进入容器的网络命名空间(-n参数)。
  3. 基本语法:nsenter [options] <program> [<argument>...],通过-t指定目标进程的PID来定位容器。
  4. 常用参数:
  • -t, --target <pid>作用:指定要进入的目标进程的PID,这是使用该命令的前提。

  • -i, --ipc[=<file>]作用:进入目标进程的IPC命名空间,用于调试进程间通信。

  • -m, --mount[=<file>]作用:进入目标进程的Mount命名空间,可访问其文件挂载点。

  • -n, --net[=<file>]作用:进入目标进程的Network命名空间,用于配置和调试网络,是最常用的参数。

  • -p, --pid[=<file>]作用:进入目标进程的PID命名空间,可查看其进程树。

  • -u, --uts[=<file>]作用:进入目标进程的UTS命名空间,可查看或修改主机名与域名。

  • -U, --user[=<file>]作用:进入目标进程的User命名空间,用于用户权限管理相关的操作。

  • -V, --version作用:显示该命令工具自身的版本信息。

  1. 适用场景:轻量级容器缺失ip、tcpdump等网络工具时,直接从宿主机调试容器网络环境。

测试下:

  • 添加对应的网络命名空间。

  • 进到宿主机放对应网络命名空间的目录。

  • 进去后查看对应接口配置;发现为空;和宿主机不一样。

下面测试下容器的网络命名空间:

  • 首先启动一个容器;理应创建了一个专属的网络命名空间。

  • 但是这里查不到;因为这指令只会显示主机默认的;而docker的专属放在一个目录里(/var/run/docker/netns)。

  • 看到了对应的busybox容器的网络命名空间。

  • 这里查看容器详情也可以看到对应的命名空间id完整版。

  • 进入容器看到它被docker0网桥分配的虚拟网卡的ip。

  • 在容器所在的网络命名空间进行ping百度;通过veth另一端给docker0网桥;然后在根据snat技术成功借助宿主机ip访问到百度;最后应答再次同理借助dnat技术完成发送给容器;故看到ping成功。

  • 与容器详情看到的ip一致。

因此,关于容器网络命名空间设计大大简化了对容器网络调试的困难。

三.本篇小结

学习完本篇将掌握Docker网络是容器技术的核心。Bridge模式通过veth pair和网桥连通容器,Overlay用隧道技术实现跨主机通信,Macvlan/IPVLAN让容器直连物理网络。理解DNAT/SNAT和网络命名空间是调试网络问题的关键。

本篇收尾了docker基础入门教程;之后会继续更新其他docker方面知识;欢迎订阅!

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询