网络类型 #

网络类型概述 #

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网络的隔离应用

下一步 #

接下来,让我们学习 自定义网络,了解如何创建和配置自定义网络。