Docker网络模式深度实践:bridge到overlay全解析
本文系统讲解Docker的四种网络模式,从原理到实践,彻底搞懂容器网络。
前言
Docker网络是容器化技术的核心难点之一。很多人用Docker只会 -p 8080:80 映射端口,对底层网络一知半解。
今天我们来彻底搞懂Docker的网络模型,包括:
- bridge(默认)
- host
- none
- macvlan
- overlay(跨主机)
一、Docker网络基础
1.1 查看网络
# 列出所有网络
docker network ls
# 默认输出
NETWORK ID NAME DRIVER SCOPE
xxxx bridge bridge local
xxxx host host local
xxxx none null local
Docker安装后默认创建三个网络:bridge、host、none。
1.2 查看网络详情
docker network inspect bridge
输出包含:
- 子网配置(Subnet)
- 网关(Gateway)
- 连接的容器
- 网络选项
二、Bridge模式(默认)
2.1 原理
┌─────────────────────────────────────────────────────────┐
│ 宿主机 │
│ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ Container1 │ │ Container2 │ │
│ │ 172.17.0.2 │ │ 172.17.0.3 │ │
│ └──────┬──────┘ └──────┬──────┘ │
│ │ │ │
│ └───────┬────────┘ │
│ │ │
│ ┌───────┴───────┐ │
│ │ docker0 │ (172.17.0.1) │
│ │ (Bridge) │ │
│ └───────┬───────┘ │
│ │ │
│ ┌───────┴───────┐ │
│ │ eth0 │ (宿主机网卡) │
│ └───────────────┘ │
└─────────────────────────────────────────────────────────┘
特点:
- 每个容器有独立的Network Namespace
- 通过虚拟网桥docker0连接
- 容器之间可以互通(同一bridge)
- 访问外网通过NAT
2.2 实践
# 默认使用bridge网络
docker run -d --name web1 nginx
docker run -d --name web2 nginx
# 查看IP
docker inspect web1 | grep IPAddress
# "IPAddress": "172.17.0.2"
docker inspect web2 | grep IPAddress
# "IPAddress": "172.17.0.3"
# 容器间通信
docker exec web1 ping 172.17.0.3
# 可以ping通
# 通过容器名通信(默认bridge不支持,需要自定义网络)
docker exec web1 ping web2
# ping: web2: Name or service not known
2.3 自定义Bridge网络
# 创建自定义网络
docker network create --driver bridge my-network
# 使用自定义网络
docker run -d --name web1 --network my-network nginx
docker run -d --name web2 --network my-network nginx
# 现在可以通过容器名通信了
docker exec web1 ping web2
# PING web2 (172.18.0.3): 可以ping通
自定义网络的优势:
- 自动DNS解析(容器名→IP)
- 更好的隔离性
- 可以指定子网和网关
2.4 端口映射
# 映射指定端口
docker run -d -p 8080:80 nginx
# 映射到随机端口
docker run -d -P nginx
# 映射到指定IP
docker run -d -p 127.0.0.1:8080:80 nginx
# 映射UDP端口
docker run -d -p 53:53/udp dns-server
三、Host模式
3.1 原理
┌─────────────────────────────────────────────────────────┐
│ 宿主机 │
│ │
│ ┌─────────────────────────────────────────────┐ │
│ │ Container │ │
│ │ (共享宿主机网络栈) │ │
│ └─────────────────────────────────────────────┘ │
│ │ │
│ │ 直接使用 │
│ ↓ │
│ ┌───────────────────────┐ │
│ │ eth0 │ │
│ │ 192.168.1.100 │ │
│ └───────────────────────┘ │
└─────────────────────────────────────────────────────────┘
特点:
- 容器直接使用宿主机网络
- 没有网络隔离
- 性能最好(无NAT开销)
- 端口冲突需要自己管理
3.2 实践
# 使用host网络
docker run -d --network host nginx
# 容器内的nginx直接监听宿主机的80端口
curl localhost:80
# 直接访问成功
# 查看容器网络
docker exec -it <container_id> ip addr
# 看到的就是宿主机的网卡
3.3 适用场景
- 对网络性能要求极高
- 需要使用大量端口
- 容器需要直接访问宿主机网络服务
四、None模式
4.1 原理
容器有独立的Network Namespace,但不配置任何网络。
docker run -d --network none nginx
特点:
- 完全隔离,没有网络
- 只有loopback接口
- 需要手动配置网络
4.2 适用场景
- 批处理任务,不需要网络
- 安全敏感的场景
- 自定义网络配置
五、Macvlan模式
5.1 原理
┌─────────────────────────────────────────────────────────┐
│ 宿主机 │
│ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ Container1 │ │ Container2 │ │
│ │192.168.1.101│ │192.168.1.102│ ← 独立MAC和IP │
│ └──────┬──────┘ └──────┬──────┘ │
│ │ │ │
│ └───────┬────────┘ │
│ │ macvlan │
│ ┌───────┴───────┐ │
│ │ eth0 │ 192.168.1.100 │
│ └───────────────┘ │
└─────────────────────────────────────────────────────────┘
│
物理网络(192.168.1.0/24)
特点:
- 每个容器有独立的MAC地址
- 直接连接物理网络
- 容器IP和宿主机在同一网段
- 看起来就像独立的物理机
5.2 实践
# 创建macvlan网络
docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 \
my-macvlan
# 运行容器
docker run -d --network my-macvlan --ip 192.168.1.101 nginx
# 从局域网其他机器可以直接访问192.168.1.101
5.3 适用场景
- 需要容器直接接入现有网络
- 运行需要独立IP的传统应用
- 网络性能要求高
六、Overlay模式(跨主机)
6.1 原理
┌─────────────────────┐ ┌─────────────────────┐
│ Host1 │ │ Host2 │
│ │ │ │
│ ┌───────────────┐ │ │ ┌───────────────┐ │
│ │ Container1 │ │ │ │ Container2 │ │
│ │ 10.0.0.2 │ │ │ │ 10.0.0.3 │ │
│ └───────┬───────┘ │ │ └───────┬───────┘ │
│ │ │ │ │ │
│ ┌───────┴───────┐ │ │ ┌───────┴───────┐ │
│ │ overlay网络 │ │ │ │ overlay网络 │ │
│ │ (VXLAN) │ │ │ │ (VXLAN) │ │
│ └───────┬───────┘ │ │ └───────┬───────┘ │
│ │ │ │ │ │
│ ┌───────┴───────┐ │ │ ┌───────┴───────┐ │
│ │ eth0 │ │←──────→│ │ eth0 │ │
│ └───────────────┘ │ 网络 │ └───────────────┘ │
└─────────────────────┘ └─────────────────────┘
特点:
- 跨主机容器通信
- 基于VXLAN隧道
- 需要Swarm或其他编排工具
- 容器感知不到底层网络拓扑
6.2 Docker Swarm方式
# Host1: 初始化Swarm
docker swarm init --advertise-addr 192.168.1.100
# Host2: 加入Swarm
docker swarm join --token <token> 192.168.1.100:2377
# 创建overlay网络
docker network create -d overlay my-overlay
# 创建服务
docker service create --name web --network my-overlay -p 80:80 nginx
6.3 跨主机容器通信的其他方案
Overlay网络配置较复杂,对于简单场景有更简单的方案:
方案1:直接暴露端口
- 每个服务映射到宿主机端口
- 通过宿主机IP+端口访问
方案2:使用组网软件
- 将多台宿主机组成虚拟局域网
- 容器使用host网络模式
- 通过虚拟IP直接通信
像星空组网这类方案可以快速将多台服务器组网,容器直接使用host模式就能实现跨主机通信,比配置overlay简单很多。
七、网络模式选择指南
| 模式 | 性能 | 隔离性 | 复杂度 | 适用场景 |
|---|---|---|---|---|
| bridge | 中 | 高 | 低 | 单机多容器,默认选择 |
| host | 高 | 无 | 低 | 性能敏感,端口多 |
| none | - | 最高 | 高 | 安全敏感,自定义网络 |
| macvlan | 高 | 高 | 中 | 需要独立IP,传统应用 |
| overlay | 中 | 高 | 高 | 跨主机容器编排 |
八、常见问题排查
8.1 容器无法访问外网
# 检查NAT规则
iptables -t nat -L -n
# 检查IP转发
cat /proc/sys/net/ipv4/ip_forward
# 应该是1
# 开启IP转发
sysctl -w net.ipv4.ip_forward=1
8.2 容器间无法通信
# 确认在同一网络
docker network inspect <network-name>
# 检查防火墙
iptables -L -n
# 测试连通性
docker exec container1 ping container2
8.3 端口映射不生效
# 检查端口是否被占用
netstat -tlnp | grep 8080
# 检查Docker代理
docker port <container-name>
# 检查iptables规则
iptables -t nat -L -n | grep 8080
九、总结
Docker网络的核心知识点:
- bridge:默认模式,容器有独立IP,通过NAT访问外网
- host:共享宿主机网络,性能最好,无隔离
- none:完全隔离,需手动配置
- macvlan:容器有独立MAC,直连物理网络
- overlay:跨主机通信,基于VXLAN
选择建议:
- 单机开发测试:bridge(自定义网络)
- 性能敏感服务:host
- 需要独立IP:macvlan
- 多主机集群:overlay或组网方案
参考资料
- Docker官方网络文档
- Linux网络虚拟化技术
- VXLAN协议规范(RFC 7348)
💡 实践建议:先在单机上把bridge模式玩熟,再考虑跨主机方案。大部分场景bridge就够用了。

浙公网安备 33010602011771号