Docker 的各种网络模式是通过 Linux 内核的网络虚拟化技术(如网络命名空间、虚拟网桥、VETH 对、iptables、Overlay 隧道等)实现的。下面详细说明每种模式的实现原理及关键配置。
1. Bridge 模式(默认)
实现原理
-
docker0
网桥:-
Docker 启动时自动创建虚拟网桥
docker0
(Linux Bridge)。 -
网桥分配私有子网(如
172.17.0.0/16
),并通过 DHCP 为容器分配 IP。
-
-
VETH 对(虚拟以太网设备):
-
每个容器创建一个网络命名空间(Network Namespace),并通过一对 VETH 设备连接容器和
docker0
网桥。 -
一端在容器内命名为
eth0
,另一端附加到docker0
。
-
-
NAT 与端口映射:
-
通过
iptables
实现 SNAT(容器访问外网)和 DNAT(外部访问容器端口)。 -
例如:
docker run -p 8080:80
会添加 iptables 规则将主机 8080 端口转发到容器 80 端口。
-
关键命令
# 查看 docker0 网桥
brctl show docker0
# 查看容器的网络命名空间
ls /var/run/docker/netns/
# 查看 iptables NAT 规则
iptables -t nat -L -n
2. Host 模式
实现原理
-
容器直接共享主机的网络命名空间,使用主机的
eth0
和端口。 -
无虚拟网桥或 NAT,容器网络栈与主机完全一致。
关键命令
docker run --network=host nginx # 容器直接监听主机的 80 端口
3. None 模式
实现原理
-
容器仅有
lo
回环接口,无外部网络连接。 -
如需网络,需手动配置(例如通过
ip netns
命令操作容器的网络命名空间)。
关键命令
# 进入容器的网络命名空间配置网络
docker inspect --format '{{.NetworkSettings.SandboxKey}}' <容器ID>
nsenter --net=<SandboxKey路径> ip addr add 192.168.1.100/24 dev eth0
4. Overlay 模式(跨主机网络)
实现原理
-
VXLAN 隧道:
-
通过 VXLAN 封装跨主机的容器流量,底层是 UDP 端口(默认 4789)。
-
每个容器网络分配唯一的 VXLAN Network ID(VNI)。
-
-
Swarm 集群协调:
- Docker Swarm 使用
gossip 协议
同步节点信息,并通过KV 存储
(如 etcd)管理网络状态。
- Docker Swarm 使用
-
数据平面:
-
Linux 内核的
vxlan
模块处理封包/解包。 -
通过
iptables
实现负载均衡和服务发现。
-
关键命令
# 创建 Overlay 网络(需 Swarm 模式)
docker network create -d overlay my-overlay
# 查看 VXLAN 设备
ip -d link show vxlan0
5. Macvlan 模式
实现原理
-
虚拟 MAC 地址:
- 为容器的
eth0
分配独立的 MAC 地址,直接绑定到主机的物理网卡(如eth0
)。
- 为容器的
-
子接口:
- 主机的物理网卡创建子接口(如
eth0.100@eth0
),每个子接口对应一个 Macvlan 网络。
- 主机的物理网卡创建子接口(如
-
交换机依赖:
- 需物理交换机支持混杂模式(Promiscuous Mode),允许一个物理网卡接收多个 MAC 地址的流量。
关键命令
# 创建 Macvlan 网络
docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 \
my-macvlan
6. IPvlan 模式
实现原理
-
共享 MAC 地址:
- 多个容器共享主机的物理网卡 MAC 地址,通过不同 IP 区分。
-
L2 与 L3 模式:
-
L2 模式:容器在同一广播域内,依赖 ARP 通信。
-
L3 模式:容器通过路由通信,需配置静态路由或三层交换机。
-
关键命令
# 创建 IPvlan L2 网络
docker network create -d ipvlan \
--subnet=192.168.1.0/24 \
-o parent=eth0 \
my-ipvlan
7. 自定义网络(User-Defined Bridge)
实现原理
-
自定义网桥:
- 用户创建的网桥(如
br-custom
)替代默认的docker0
。
- 用户创建的网桥(如
-
内置 DNS 服务:
- Docker 为自定义网络启动内嵌的 DNS 服务器,支持容器名称解析。
-
网络隔离:
- 可通过
--internal
禁止容器访问外网。
- 可通过
关键命令
# 创建自定义 Bridge 网络
docker network create --driver=bridge \
--subnet=10.1.0.0/16 \
--gateway=10.1.0.1 \
my-bridge
底层技术总结
技术 | 作用 | 相关命令/工具 |
---|---|---|
网络命名空间 | 隔离容器的网络栈 | ip netns |
VETH 对 | 连接容器与网桥/主机 | ip link add veth0 type veth |
Linux Bridge | 实现二层交换(如 docker0 ) |
brctl show |
iptables | NAT/端口映射/防火墙 | iptables -t nat -L |
VXLAN | 跨主机的 Overlay 隧道 | ip -d link show vxlan0 |
MACVLAN/IPVLAN | 直接接入物理网络 | ip link add macvlan0 link eth0 type macvlan |
配置示例
跨主机 Overlay 网络(Swarm 模式)
# 初始化 Swarm
docker swarm init
# 创建 Overlay 网络
docker network create -d overlay --attachable my-overlay
# 在 Overlay 网络中启动服务
docker service create --network=my-overlay nginx
Macvlan 网络(容器直连物理网络)
docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 \
my-macvlan
docker run --network=my-macvlan --ip=192.168.1.100 nginx
总结
-
Bridge/Host/None:依赖 Linux 基础网络虚拟化技术(网桥、命名空间)。
-
Overlay:基于 VXLAN 和集群协调(Swarm/Kubernetes)。
-
Macvlan/IPvlan:直接操作物理网卡,绕过虚拟网桥。
-
自定义网络:通过用户定义的网桥增强灵活性和隔离性。
理解这些实现原理后,可以更精准地选择网络模式并排查问题(如性能瓶颈、连通性故障)。