深入理解 Docker 网络:Bridge、Host、Overlay 与 None 模式详解
深入理解 Docker 网络:Bridge、Host、Overlay 与 None 模式详解
Docker 让应用像“积木”一样组合运行,而网络是连接这些积木的“神经系统”。
要让容器间通信、访问外部网络,或在集群中协作运行,你必须掌握 Docker 的网络机制。本文将深入讲解 Docker 的四种核心网络模式:Bridge、Host、Overlay 与 None。
一、Docker 网络的核心概念
在 Docker 中,每个容器都有自己独立的网络命名空间(Network Namespace),
包括:
- 独立的 IP 地址
- 独立的网络接口
- 独立的路由表
Docker 通过创建虚拟网桥(bridge)、虚拟以太网接口(veth pair)等机制,实现容器之间、容器与外界之间的通信。
二、查看当前 Docker 网络
docker network ls
示例输出:
NETWORK ID NAME DRIVER SCOPE
b32d6b8a5f43 bridge bridge local
7d1e8d7c4a1d host host local
ee4c62b16a32 none null local
默认会有三种网络:
bridge:容器默认使用的网络;host:直接使用宿主机网络;none:完全隔离,不联网。
三、Bridge 网络(默认模式)
定义
Bridge(桥接) 网络是 Docker 默认的网络模式。
每个容器通过一个虚拟网卡(veth pair)连接到 Docker 创建的网桥(通常是 docker0)。
拓扑结构图
+------------------------+
| 宿主机(Host) |
| |
| +-----------------+ |
| | docker0 网桥 |---|--- 外部网络
| +---+---------+---+ |
| | | |
| [veth0] [veth1] |
| | | |
| 容器A 容器B |
+------------------------+
⚙️ 容器创建示例
docker run -d --name web1 nginx
docker run -d --name web2 nginx
这两个容器都会自动连接到默认的 bridge 网络。
网络互通测试
docker exec -it web1 ping web2
如果容器使用默认 bridge 网络,必须通过 IP 地址互相访问。
更推荐使用自定义 bridge 网络(见下文)。
创建自定义 bridge 网络(推荐)
docker network create mynet
运行容器并加入:
docker run -d --name app1 --network mynet nginx
docker run -d --name app2 --network mynet busybox sleep 3600
容器间可通过 容器名 通信:
docker exec -it app1 ping app2
✅ 自定义 bridge 网络支持容器 DNS 自动解析,非常适合在单机环境中运行多个服务。
⚡ 四、Host 网络模式
定义
Host 模式 是让容器直接使用宿主机的网络栈,不再分配独立的网络命名空间。
特点
| 特性 | 说明 |
|---|---|
| 网络共享 | 容器与宿主机共用 IP、端口 |
| 性能更高 | 无 NAT 转换,网络延迟最低 |
| 隔离性差 | 容器与宿主机网络完全暴露 |
⚙️ 示例
docker run -d --name web --network host nginx
此时容器的 Nginx 会直接监听在宿主机的 80 端口:
访问宿主机 IP 即可访问容器。
注意:
-p参数在 Host 模式下无效;- 适用于对性能要求高的服务(如监控代理、VPN、边缘网关)。
☁️ 五、Overlay 网络(跨主机通信)
定义
Overlay 网络 是 Docker Swarm 或 Kubernetes 使用的核心机制。
它基于 VXLAN 隧道实现跨主机容器互联。
拓扑结构图
Node1 (Host A) Node2 (Host B)
+-------------+ +-------------+
| Container A |<---------->| Container B |
| (10.0.0.2)| VXLAN | (10.0.0.3)|
+-------------+ +-------------+
Overlay 网络会将容器间的通信数据封装成 UDP 包,通过宿主机网络传输。
创建 Overlay 网络(需启用 Swarm 模式)
docker swarm init
docker network create -d overlay my_overlay
在 Swarm 集群中启动服务:
docker service create --name web --network my_overlay nginx
现在,所有加入该 Swarm 集群的节点上的 web 容器,都能跨主机互通。
六、None 网络模式
定义
None 模式 是完全隔离的网络环境。
容器启动后不连接任何网络接口(除了 loopback)。
⚙️ 示例
docker run -d --name isolated --network none alpine sleep 3600
容器内部无法访问外网,也无法被访问。
适用于:
- 离线任务;
- 高安全性应用;
- 手动配置自定义网络。
七、四种网络模式对比
| 模式 | 是否隔离 | 是否共享宿主机网络 | 是否支持 DNS 解析 | 是否可跨主机 | 使用场景 |
|---|---|---|---|---|---|
| bridge | ✅ 是 | ❌ 否 | ✅ 支持(自定义网络) | ❌ 否 | 默认模式,本地开发 |
| host | ❌ 否 | ✅ 是 | ❌ 否 | ❌ 否 | 高性能、监控代理 |
| overlay | ✅ 是 | ❌ 否 | ✅ 支持 | ✅ 是 | Swarm/K8s 集群 |
| none | ✅ 完全隔离 | ❌ 否 | ❌ 否 | ❌ 否 | 安全、手动网络配置 |
八、常用网络操作命令
| 操作 | 命令 |
|---|---|
| 查看所有网络 | docker network ls |
| 查看网络详情 | docker network inspect mynet |
| 创建网络 | docker network create mynet |
| 删除网络 | docker network rm mynet |
| 连接容器到网络 | docker network connect mynet web |
| 从网络断开容器 | docker network disconnect mynet web |
九、实际应用场景示例
1. 多容器互联(Web + DB)
docker network create app_net
docker run -d --name db --network app_net mysql:8.0
docker run -d --name web --network app_net -e DB_HOST=db nginx
容器
web可通过DB_HOST=db与数据库通信。
☁️ 2. Swarm 集群跨主机通信
docker network create -d overlay global_net
docker service create --name app --network global_net nginx
所有节点的容器实例自动连入同一个虚拟子网,实现跨主机互联。
十、总结与最佳实践
| 场景 | 推荐网络模式 |
|---|---|
| 本地开发 | 自定义 bridge |
| 高性能服务 | host |
| 多主机通信 / 集群 | overlay |
| 安全隔离 / 离线任务 | none |
一句话总结:
Bridge 是默认,Host 是直连,Overlay 是跨主机,None 是隔离。
浙公网安备 33010602011771号