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网络的核心知识点:

  1. bridge:默认模式,容器有独立IP,通过NAT访问外网
  2. host:共享宿主机网络,性能最好,无隔离
  3. none:完全隔离,需手动配置
  4. macvlan:容器有独立MAC,直连物理网络
  5. overlay:跨主机通信,基于VXLAN

选择建议:

  • 单机开发测试:bridge(自定义网络)
  • 性能敏感服务:host
  • 需要独立IP:macvlan
  • 多主机集群:overlay或组网方案

参考资料

  1. Docker官方网络文档
  2. Linux网络虚拟化技术
  3. VXLAN协议规范(RFC 7348)

💡 实践建议:先在单机上把bridge模式玩熟,再考虑跨主机方案。大部分场景bridge就够用了。


posted @ 2025-12-12 16:21  花宝宝  阅读(3)  评论(0)    收藏  举报