Docker网络模式深度实践:bridge到overlay全解析

本文系统讲解Docker的四种网络模式,从原理到实践,彻底搞懂容器网络。

前言

Docker网络是容器化技术的核心难点之一。很多人用Docker只会
-p 8080:80
映射端口,对底层网络一知半解。

今天我们来彻底搞懂Docker的网络模型,包括:

bridge(默认)hostnonemacvlanoverlay(跨主机)


一、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就够用了。



© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
士大夫是下辖的头像 - 鹿快
评论 抢沙发

请登录后发表评论

    暂无评论内容