一、容器网络
1. Docker网络模型
- veth pair:成对出现的虚拟网络设备,数据从一端进从另一端出,用于解决网络命名空间之间的隔离问题。相当于在容器和宿主机之间建立"网线"连接。
- docker0网桥:二层网络设备,将Linux支持的端口连接起来,实现类似交换机的多对多通信。默认IP为172.17.0.1/16,容器通过veth pair接入该网桥。
- 网络隔离机制:容器拥有独立的网络命名空间,通过veth pair与宿主机通信。容器内eth0地址(如172.17.0.2)与宿主机veth设备成对出现。
- 通信原理:docker0作为虚拟交换机,容器间通过MAC地址进行二层通信,宿主机通过路由表和iptables规则实现与容器的三层通信。
2. 容器网络访问
1)外部访问容器
- DNAT机制:通过iptables -t nat -vnL DOCKER可查看规则,将宿主机端口(如88)流量转发到容器IP(如172.17.0.2:80)。
- 完整流程:
- 外部请求到达宿主机88端口
- iptables做DNAT转换(目的地址改为容器IP)
- 路由表判断下一跳为docker0网桥
- 通过ARP广播找到目标容器
- 数据经veth pair进入容器
2)容器访问外部
- SNAT机制:通过iptables -t nat -vnL POSTROUTING可见MASQUERADE规则,将容器源IP(172.17.0.0/16)替换为宿主机IP。
- 完整流程:
- 容器流量经veth pair到达宿主机
- 路由判断走默认网关(宿主机网卡)
- iptables做SNAT转换(源地址改为宿主机IP)
- 通过宿主机网络访问互联网
3)Docker使用iptables实现网络通信
- 外部访问容器流程
- 关键规则:DNAT tcp -- !docker0 *0.0.0.0/0 tcp dpt:88 to:172.17.0.2:80
- 路由判断:通过ip route可见172.17.0.0/16网段流量走docker0设备
- ARP解析:docker0网桥通过二层广播找到目标容器MAC地址
- 容器访问外部流程
- 容器路由:default via 172.17.0.1 dev eth0,所有非本地流量走docker0网关
- SNAT规则:MASQUERADE all -- *!docker0 172.17.0.0/16 0.0.0.0/0
- 地址转换:将容器源IP(172.17.0.3)伪装成宿主机IP(192.168.31.61)发出
二、知识小结
知识点 |
核心内容 |
技术实现 |
关键命令/工具 |
Docker网络基础模型 |
通过docker0网桥实现容器通信,类比交换机功能 |
虚拟网桥+veth pair设备对 |
ip addr/ifconfig查看docker0 |
容器间通信 |
容器通过veth pair连接到docker0网桥,基于MAC地址二层互通 |
veth pair跨网络命名空间连接 |
ip link查看虚拟设备对 |
宿主机与容器通信 |
veth pair解决宿主机与容器网络命名空间隔离问题 |
虚拟网线双向数据传输 |
nsenter进入命名空间验证 |
外部访问容器 |
端口映射(-p 88:80)通过iptables DNAT实现 |
目标地址转换(DNAT)+路由表查询 |
iptables -t nat -vnL DOCKER |
容器访问外部网络 |
容器流量经docker0→宿主机→SNAT转换源IP后出站 |
源地址转换(SNAT)+默认网关 |
iptables -t nat -vnL POSTROUTING |
关键网络组件 |
docker0网桥(默认)、veth pair(虚拟网线)、iptables规则 |
网桥管理+流量转发+地址转换 |
brctl show(网桥工具) |
典型问题排查 |
容器无法互通/无法访问外网时检查iptables规则和路由表 |
规则优先级+路由路径验证 |
route -n查看路由表 |