深入理解 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 是隔离。


延伸阅读