一、核心定位

Docker 默认网络模式:bridge 桥接模式(自定义网桥原理完全一致)。

核心特性:容器拥有独立网络命名空间,与宿主机网络隔离,通过虚拟设备组网通信。

所有普通容器(未指定--net参数)默认都走这套网络架构,也是Docker端口映射 -p 宿主机端口:容器端口 的底层依赖。

二、三大核心虚拟设备

1. docker0 虚拟网桥

本质:宿主机内核中的虚拟二层交换机,存在于宿主机根网络命名空间。

核心作用:

  • 统一接入所有默认模式启动的容器

  • 负责宿主机 <-> 容器、容器 <-> 容器之间的二层流量转发

  • 自带内网网段(默认 172.17.0.0/16),是容器的网关设备

2. veth pair 虚拟网线(核心关键)

本质:成对出现的虚拟网络设备,是跨网络命名空间的唯一通信通道。

结构(永远是一对一绑定):

  • 一端:宿主机侧 veth 设备,挂载在 docker0 网桥上(宿主机根命名空间)

  • 一端:容器内 eth0 网卡(容器独立命名空间)

核心特性:流量从一端进入,内核自动无损转发到另一端,无例外。

3. iptables 转发规则

Docker 自动在宿主机生成 NAT 规则,支撑外网/宿主机端口映射功能。

  • DNAT:入站流量,将「宿主机IP:端口」转发为「容器内网IP:端口」

  • SNAT:出站流量,将容器内网IP伪装为宿主机IP,保证回包正常

三、最核心原理:网络命名空间隔离(90%人误解的点)

✅ 事实:Docker 进程确实跑在宿主机上

❌ 误区:同一台机器就可以直接通信

💡 关键:容器拥有独立的网络命名空间

  • 宿主机:根网络命名空间,拥有 ens33、docker0、宿主机侧veth

  • 容器:全新独立网络命名空间,只有 eth0 网卡

  • 两套网络协议栈、网卡、路由表完全隔离,互相不可见

结论:docker0 无法直接转发流量到容器 eth0,必须通过 veth pair 穿墙中转。

四、完整流量链路(外部访问容器 -p 端口映射场景)

场景示例:docker run -p 32768:80 nginx,外部访问 http://192.168.40.180:32768

  1. 客户端请求:访问宿主机公网IP+端口 192.168.40.180:32768

  2. 宿主机iptables DNAT:改写数据包目标地址,从「宿主机IP:32768」转为「容器内网IP:80」

  3. 内核路由转发:识别目标网段为docker0网段,将数据包交给docker0网桥

  4. docker0二层转发:查询MAC地址表,找到对应绑定的宿主机侧veth设备

  5. veth pair中转:流量从宿主机veth穿透到容器内eth0网卡

  6. 容器接收请求:eth0将流量交给容器内监听80端口的Nginx服务

五、回包反向链路(容器响应客户端)

  1. 容器Nginx生成响应数据包,从容器内eth0发出

  2. 通过veth pair虚拟网线,传回宿主机侧veth设备

  3. 流量进入docker0网桥,转发至宿主机协议栈

  4. 宿主机iptables SNAT规则:伪装源地址为宿主机公网IP

  5. 通过宿主机物理网卡ens33,返回给客户端

六、极简一句话终极总结(面试直接背)

Docker 默认 bridge 模式下,外网端口映射流量经过 iptables 地址转换后,交由 docker0 网桥转发,通过 veth pair 跨命名空间穿透,最终送达容器内部服务,实现宿主机与隔离容器的网络通信。

七、拓展对比:Host网络模式(无网桥、无veth)

当容器使用 --net=host 时:

  • 不创建独立网络命名空间,容器直接复用宿主机整套网络栈

  • 无需 docker0 网桥、无需 veth pair 虚拟设备

  • 直接监听宿主机物理端口,网络无隔离、性能更高,但安全性更低

八、核心知识点速记表

设备/规则

核心作用

是否跨命名空间

docker0

虚拟交换机,负责容器流量二层转发

否(仅宿主机内部)

veth pair

穿墙虚拟网线,连接宿主机与容器网络

是(唯一通道)

iptables NAT

端口映射、地址转换,支撑外网访问容器

否(宿主机内核规则)

更多推荐