文章目录
- 本篇摘要
- 一.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 ovnet1MACVLAN网络
为每个容器的虚拟网卡分配一个真实的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 mac1IPVLAN网络
核心功能:
- 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技术
Bridge模式:
通过veth pair和Network Namespace技术,Docker 实现了容器与宿主机及外部的网络连通。
NAT技术
由于容器(veth pair)的IP与宿主机IP不在同一网段,导致外部网络无法直接发现或通过容器IP访问其内部服务; Docker 采用NAT(网络地址转换)技术,让外部网络能够主动将数据包发送到容器内部。
端口绑定:
容器内的服务监听自身的IP和端口(
port_0),Docker 通过 NAT 将此端口与宿主机的某个端口(port_1)进行“绑定”或映射。这样,外部访问宿主机port_1的流量就会被自动转发到容器内部的port_0。
一句话:Docker通过NAT技术,将容器内部的端口与宿主机端口进行映射,解决了外部网络无法直接访问隔离容器的问题。
容器与宿主机外部如何打通
- 外界访问容器(入方向):
- 通过DNAT(目标地址转换)实现。
- 外部请求访问宿主机IP:端口,宿主机根据DNAT规则将其目的IP和端口改写为容器的IP和端口,并通过veth pair将请求转发给容器内服务。
- 容器访问外界(出方向):
- 通过SNAT(源地址转换)实现。
- 容器发出的请求,其源IP是容器IP。请求经veth pair和网桥到达宿主机后,宿主机根据SNAT规则将其源IP改写为宿主机IP,再发往外网。
- 响应报文如何返回容器:
- 关键靠
conntrack(连接跟踪)机制,而非DNAT。 - 对于已建立的连接(ESTABLISHED)或相关连接(RELATED)的响应报文,宿主机能自动识别并将其直接返回给原始的容器,无需额外配置端口映射。
- 核心依赖:
- veth pair:连接容器与宿主机网桥的“虚拟网线”。
- 网桥(docker0):充当容器网络的虚拟交换机。
- IP转发:需开启宿主机内核的IP转发功能(
/proc/sys/net/ipv4/ip_forward),宿主机才能为容器转发数据包。
一句话:Docker通过DNAT让外界能访问容器,通过SNAT让容器能访问外界,依靠连接跟踪机制确保响应报文正确返回。
iptables简单介绍
核心功能:
iptables 是 Linux 系统自带的免费包过滤防火墙,主要用于实现封包过滤、重定向和网络地址转换(NAT)等核心安全功能。
四张功能表:
- filter 表:最常用,负责基础包过滤,决定数据包是否允许通过。
- nat 表:负责网络地址转换(如SNAT、DNAT),用于共享上网或端口映射。
- mangle 表:用于修改数据包内容(如TTL)。
- raw 表:用于连接跟踪前的数据包处理。
常用命令参数:
-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介绍
- 命令用途:
nsenter命令用于进入指定进程(尤其是容器)的命名空间,从而使用宿主机的网络工具(如ip、ping)调试容器内部网络,解决容器内缺少基础命令的问题。 - 核心功能:通过参数进入不同类型的命名空间(如网络、PID、挂载等),最常用的是进入容器的网络命名空间(
-n参数)。 - 基本语法:
nsenter [options] <program> [<argument>...],通过-t指定目标进程的PID来定位容器。 - 常用参数:
-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作用:显示该命令工具自身的版本信息。
- 适用场景:轻量级容器缺失
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方面知识;欢迎订阅!