文章目录
- 1. bridge(默认)
- 2. host
- 3. none
- 4. container
- 5. overlay
- 6. macvlan
- 7. 总结对比
Docker 六种网络模式是容器网络的基础概念,不同模式决定容器与宿主机、外部网络、其他容器之间的通信方式。
1. bridge(默认)
Bridge模式:容器界的"小区共享Wi-Fi"。
容器连接到 docker0 网桥,通过 NAT 方式与外部通信。
当你运行docker run nginx时,Docker默认会把容器接入这个"小区共享网络"。所有容器通过docker0虚拟网桥互相串门,就像住户共享路由器——容器172.17.0.2想访问172.17.0.3?直接喊名字就行(容器名DNS解析)。但要从外网访问,得通过-p 8080:80这种"快递柜"(端口映射),不然外卖员可找不到你家。
特点:
-
每个容器有独立 IP(172.17.x.x)。
-
宿主机通过 docker0 转发数据包。
-
默认 docker run 就是这种模式。
为什么默认bridge模式下容器IP总变?
因为Docker像小区物业,每次重启容器都可能换"门牌号"。解决办法:docker network create my_bridge创建自定义网桥,稳定性堪比买产权房。
命令示例:
docker run -d --name web --network bridge nginx
2. host
容器直接使用宿主机的网络栈,不再分配独立的 IP。
性能狂魔的"裸奔"选择
直接把宿主机的网络栈"借"给容器用——没有NAT转发,没有虚拟网卡,容器端口直接暴露在主机IP上。就像把家里电器直接接到市政电网,省电但危险:两个容器都想用80端口?对不起,后启动的直接"跳闸"(端口冲突)。
特点:
-
网络性能最好(无 NAT)。
-
容器内服务端口与宿主机端口冲突。
-
常用于需要高性能或与宿主机紧密耦合的服务。
命令示例:
docker run -d --network host nginx
3. none
容器有独立的网络命名空间,但不做任何网络配置。
与世隔绝的"安全屋"
启动容器时加–net=none,Docker会给它建个独立网络命名空间,但啥都不配置——没有IP,没有网关,只有一个孤零零的lo接口。就像把服务器关进法拉第笼,物理隔绝网络攻击。
手动配置网络
特点:
-
没有网卡、IP、路由。
-
只能通过 ip link 手动配置。
-
常用于自定义网络场景或安全隔离。
命令示例:
docker run -d --network none busybox sleep 3600
适合存放密钥的容器,或者需要手动搭建VPN隧道的场景——安全到连自己都可能忘记怎么进去。
4. container
让新容器与已存在的容器共享网络命名空间。
容器界的"合租室友"
让新容器共享已有容器的网络命名空间,相当于两个室友共用一个WiFi账号和IP。比如前端容器和后端容器共享网络,前端直接用localhost:8080访问后端,省掉端口映射的麻烦。
特点:
-
共享 IP、端口、网络栈。
-
类似于在同一个“网络空间”中运行多个进程。
命令示例:
docker run -d --name web1 nginx
docker run -d --network container:web1 busybox sleep 3600
5. overlay
用于跨宿主机的分布式网络(Swarm/Kubernetes 常用)。
跨主机通信的"高铁网络"
当容器分布在多台主机时,Overlay网络就是连接它们的"高铁系统"。通过VXLAN隧道技术(默认4789端口),把不同主机的容器编织成一个虚拟局域网。Swarm集群会自动分配10.0.0.0/8网段,服务发现靠内置DNS,比传统跨主机通信快30%。
特点:
基于 VXLAN 实现隧道,容器在不同宿主机也能互通。
常用于多机集群环境。
命令示例(需要 Swarm/K8s 集群支持):
docker network create -d overlay mynet
docker service create --name myweb --network mynet nginx
配置复杂度很高,需要集群管理经验。
6. macvlan
让容器像宿主机一样直接拥有物理网络的 MAC 地址和 IP。
给容器分配真实MAC地址,让它在物理网络中"假装"是台物理机。交换机看到它会以为是新接入的服务器,直接通过MAC地址转发数据,延迟低到可以忽略。
两种姿势:
- VEPA模式:所有流量走物理网卡,适合需要交换机策略控制的场景
- 桥接模式:直接连接物理网卡子接口,需交换机支持802.1Q VLAN
特点:
-
容器直接暴露在物理网络中(跟虚拟机类似)。
-
无需 NAT,性能接近物理机。
-
需要网络环境支持(交换机允许混杂模式)。
命令示例:
docker network create -d macvlan \--subnet=192.168.1.0/24 \--gateway=192.168.1.1 \-o parent=eth0 mymacvlandocker run -d --network mymacvlan nginx
7. 总结对比
模式 | 是否独立 IP | 是否 NAT | 使用场景 |
---|---|---|---|
bridge | ✅ 是 | ✅ 有 | 默认容器网络,单机应用 |
host | ❌ | 否 ❌ 无 | 高性能需求,端口复用限制 |
none | ❌ 否 | ❌ 无 | 手动配置网络,安全隔离 |
container | ❌ 共享 | ❌ 无 | 多容器共享网络栈 |
overlay | ✅是 | ✅ 有 | 跨主机容器互通,集群 |
macvlan | ✅是 | ❌ 无 | 容器直接暴露在物理网络 |
“人的一生会经历很多痛苦,但回头想想,都是传奇”。