网络类型 #
网络类型概述 #
Docker支持多种网络驱动,每种驱动适用于不同的场景:
text
┌─────────────────────────────────────────────────────┐
│ 网络驱动类型 │
├─────────────────────────────────────────────────────┤
│ │
│ bridge - 桥接网络(默认) │
│ host - 主机网络 │
│ none - 无网络 │
│ overlay - 覆盖网络(跨主机) │
│ macvlan - MAC地址网络 │
│ ipvlan - IP地址网络 │
│ │
└─────────────────────────────────────────────────────┘
Bridge网络 #
默认bridge网络 #
bash
# 使用默认bridge网络
docker run -d --name web1 nginx
docker run -d --name web2 nginx
# 容器只能通过IP通信
docker exec web1 ping -c 3 <web2-ip>
# 不能通过容器名通信
docker exec web1 ping web2 # 失败
自定义bridge网络 #
bash
# 创建自定义bridge网络
docker network create --driver bridge mybridge
# 运行容器
docker run -d --name web1 --network mybridge nginx
docker run -d --name web2 --network mybridge nginx
# 可以通过容器名通信
docker exec web1 ping -c 3 web2 # 成功
自定义bridge优势 #
text
┌─────────────────────────────────────────────────────┐
│ 自定义bridge vs 默认bridge │
├─────────────────────────────────────────────────────┤
│ │
│ 自定义bridge: │
│ ✓ 支持容器名解析 │
│ ✓ 更好的隔离 │
│ ✓ 动态连接/断开 │
│ ✓ 可配置IP范围 │
│ │
│ 默认bridge: │
│ ✗ 不支持容器名解析 │
│ ✗ 所有容器在同一网络 │
│ ✗ 只能通过IP通信 │
│ │
└─────────────────────────────────────────────────────┘
bridge网络配置 #
bash
# 创建自定义bridge网络
docker network create \
--driver bridge \
--subnet=172.25.0.0/16 \
--gateway=172.25.0.1 \
--ip-range=172.25.1.0/24 \
mybridge
# 查看网络
docker network inspect mybridge
Host网络 #
使用host网络 #
bash
# 使用host网络
docker run -d --name web --network host nginx
# 容器直接使用宿主机网络
# 无需端口映射
curl http://localhost:80
# 查看网络配置
docker exec web ip addr
host网络特点 #
text
┌─────────────────────────────────────────────────────┐
│ host网络特点 │
├─────────────────────────────────────────────────────┤
│ │
│ 优点: │
│ - 无网络隔离,性能最高 │
│ - 无需端口映射 │
│ - 直接使用宿主机网络 │
│ │
│ 缺点: │
│ - 无网络隔离 │
│ - 端口冲突风险 │
│ - 安全性较低 │
│ │
│ 适用场景: │
│ - 需要高性能网络 │
│ - 网络监控工具 │
│ - 端口冲突可控 │
│ │
└─────────────────────────────────────────────────────┘
应用示例 #
bash
# 网络监控工具
docker run -d --network host nicolaka/netshoot
# 性能测试工具
docker run --network host --rm williamyeh/wrk -t4 -c100 -d30s http://localhost:80
Overlay网络 #
什么是Overlay网络? #
Overlay网络用于跨主机的容器通信,主要用于Docker Swarm集群。
text
┌─────────────────────────────────────────────────────┐
│ Overlay网络架构 │
├─────────────────────────────────────────────────────┤
│ │
│ Host A Host B │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ Container A │ │ Container B │ │
│ └──────┬──────┘ └──────┬──────┘ │
│ │ │ │
│ ┌──────▼──────┐ ┌──────▼──────┐ │
│ │ docker0 │ │ docker0 │ │
│ └──────┬──────┘ └──────┬──────┘ │
│ │ │ │
│ └──────────────────────────┘ │
│ VXLAN Tunnel │
│ │
└─────────────────────────────────────────────────────┘
创建Overlay网络 #
bash
# 初始化Swarm集群
docker swarm init
# 创建Overlay网络
docker network create --driver overlay myoverlay
# 创建加密的Overlay网络
docker network create --driver overlay --attachable --opt encrypted myoverlay
# 使用Overlay网络
docker service create --name web --network myoverlay nginx
Overlay网络配置 #
bash
# 创建指定子网的Overlay网络
docker network create \
--driver overlay \
--subnet=10.0.0.0/24 \
--gateway=10.0.0.1 \
myoverlay
# 创建可附加的Overlay网络
docker network create \
--driver overlay \
--attachable \
myoverlay
Macvlan网络 #
什么是Macvlan? #
Macvlan允许容器拥有独立的MAC地址,直接出现在物理网络上。
text
┌─────────────────────────────────────────────────────┐
│ Macvlan网络架构 │
├─────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────┐ │
│ │ Physical Network │ │
│ └─────────────────────────────────────────────┘ │
│ │ │ │ │
│ ┌────▼────┐ ┌────▼────┐ ┌────▼────┐ │
│ │Container│ │Container│ │Container│ │
│ │ MAC: A │ │ MAC: B │ │ MAC: C │ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ │
└─────────────────────────────────────────────────────┘
创建Macvlan网络 #
bash
# 创建Macvlan网络
docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 \
mymacvlan
# 使用Macvlan网络
docker run -d --network mymacvlan --ip=192.168.1.100 nginx
Macvlan模式 #
| 模式 | 说明 |
|---|---|
| bridge | 默认模式,容器间可通信 |
| private | 容器间不能通信 |
| passthru | 单容器模式 |
Macvlan注意事项 #
bash
# 注意: 宿主机无法直接访问Macvlan容器
# 解决方案: 创建辅助网络接口
# 创建辅助接口
ip link add macvlan0 link eth0 type macvlan mode bridge
ip addr add 192.168.1.200/32 dev macvlan0
ip link set macvlan0 up
ip route add 192.168.1.100/32 dev macvlan0
IPvlan网络 #
什么是IPvlan? #
IPvlan与Macvlan类似,但所有容器共享相同的MAC地址。
bash
# 创建IPvlan网络
docker network create -d ipvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 \
myipvlan
# 使用IPvlan网络
docker run -d --network myipvlan --ip=192.168.1.100 nginx
IPvlan vs Macvlan #
text
┌─────────────────────────────────────────────────────┐
│ IPvlan vs Macvlan │
├─────────────────────────────────────────────────────┤
│ │
│ IPvlan: │
│ - 共享MAC地址 │
│ - 交换机MAC表限制少 │
│ - 更适合大规模部署 │
│ │
│ Macvlan: │
│ - 独立MAC地址 │
│ - 每个容器都是独立网络实体 │
│ - 交换机MAC表可能溢出 │
│ │
└─────────────────────────────────────────────────────┘
None网络 #
使用None网络 #
bash
# 创建无网络容器
docker run -d --network none --name isolated alpine sleep 1000
# 验证无网络
docker exec isolated ip addr
# 只有loopback接口
应用场景 #
bash
# 安全隔离场景
docker run -d --network none --name secure-app myapp
# 仅本地处理
docker run -d --network none --name batch-processor myapp
网络类型选择 #
text
┌─────────────────────────────────────────────────────┐
│ 网络类型选择指南 │
├─────────────────────────────────────────────────────┤
│ │
│ 场景 推荐网络类型 │
│ ───────────────────────────────────────────────── │
│ 单机容器通信 bridge │
│ 高性能网络 host │
│ 跨主机通信 overlay │
│ 容器需要独立IP macvlan/ipvlan │
│ 完全隔离 none │
│ │
└─────────────────────────────────────────────────────┘
小结 #
本节学习了Docker的各种网络类型:
- Bridge网络的特点和使用
- Host网络的适用场景
- Overlay网络的跨主机通信
- Macvlan和IPvlan网络
- None网络的隔离应用
下一步 #
接下来,让我们学习 自定义网络,了解如何创建和配置自定义网络。