Docker 容器网络深度原理
一、前置基础
Docker 网络依托 Linux 内核:Network Namespace、veth pair、bridge、iptables、路由。
- Network Namespace:实现网络隔离,每个容器独立协议栈(网卡、IP、路由、arp);
- veth pair:成对虚拟网卡,一端宿主机网桥、一端容器ns;
Docker内置5种网络驱动:bridge(默认)、host、none、container、overlay,生产最常用bridge+overlay。
# 查看网络
docker network ls
二、Bridge桥接模式(默认,单机容器互通+外网访问)
1.架构结构
- 宿主机自动生成网桥:
docker0(linux网桥设备) - 新建容器:创建一组veth pair:
vethxxx(宿主机侧) <--> eth0(容器内) - veth宿主机端挂载绑定到
docker0网桥;容器eth0落在自身netns。
外网网卡eth0 ←→ 宿主机内核路由/iptables ←→ docker0网桥
↓
veth pair ←→ 容器eth0(独立ns)
2.三个通信场景
- 容器 ↔ 同宿主机其他容器
经过docker0二层转发,同网段直接互通。 - 容器 → 外网互联网
SNAT:iptables nat表POSTROUTING做源地址转换,容器内网IP→宿主机公网IP出站。 - 外网 → 容器(端口映射-p)
DNAT:-p 宿主机端口:容器端口,iptables PREROUTING把宿主机端口流量转发容器内网IP。
-p 8080:80本质就是iptables DNAT规则。
3.缺点
只能单机互通,跨宿主机容器不能直接通信。
三、Host主机模式
容器不创建独立Network Namespace,直接共用宿主机网络协议栈。
- 无docker0、无veth,容器IP=宿主机IP;
- 启动端口占用宿主机端口,无需端口映射;
- 隔离最弱,性能最好,适合监控类、高性能组件。
docker run --net=host xxx
四、None无网络模式
容器创建独立ns,但不配置任何网卡、IP、路由,完全断网;仅本地磁盘读写,安全隔离场景。
docker run --net=none xxx
五、Container复用容器网络
新容器复用已有容器的Network Namespace,共用一张网卡、同一个IP。
典型场景:sidecar架构(日志采集容器和业务容器共享网络)
# 复用容器id为abc的网络
docker run --net=container:abc xxx
六、Overlay跨主机网络(Swarm集群跨宿主机互通,重点)
原理:VXLAN隧道技术(内核封装UDP报文)
- 跨宿主机容器不在同一docker0,通过Overlay驱动+VXLAN实现二层互通;
- 数据包:容器报文 → 内核封装VXLAN头(UDP 4789端口) → 宿主机网卡 → 对端宿主机解封装 → 目标容器。
- 架构分层:
- 每个节点内部:本地bridge;
- 跨节点:VXLAN隧道打通二层,所有Overlay容器同网段。
适用:Docker Swarm集群、多机器容器互通。
# 创建overlay跨主机网络
docker network create -d overlay my-over
七、自定义bridge(生产规范替代docker0)
不使用默认docker0,自建网桥,便于网段规划:
docker network create -d bridge my-bridge
docker run --net=my-bridge xxx
八、关键内核知识点(面试高频)
- veth pair特点:管道型虚拟网卡,一端收、一端发,成对出现;
- namespace隔离:容器看不到宿主机真实网卡,内核实现网络资源隔离;
- 端口映射底层 = iptables DNAT/SNAT;
- Overlay底层=VXLAN,封装在UDP,跨三层网络实现二层互通。
九、Obsidian面试卡片
tags: #Docker #容器网络 #bridge #overlay #VXLAN #面试
题型:原理简答
难度:高级
题目:简述Docker五种网络模式原理与适用场景?
精简答案:
1.bridge默认:docker0网桥+veth pair,单机容器互通,iptables实现端口映射与外网访问;
2.host:共用宿主机ns,无隔离,性能高,共用宿主机IP端口;
3.none:空网络,无网卡,完全隔离断网;
4.container:复用其他容器ns,同IP,sidecar常用;
5.overlay:基于VXLAN隧道,跨宿主机容器二层互通,集群使用。
拓展:bridge靠SNAT/DNAT实现内外网互通,Overlay依靠内核VXLAN封装UDP报文跨机器传输。
易错点:默认docker0是bridge,无法跨主机通信,跨主机需要overlay。
关联:[[Docker 联合文件系统|Docker 联合文件系统 Overlay2]]
关联文档
- ../network/网络 — 网络基础
- ../kubernetes/service/K8s Service 核心原理 — K8s 网络