为什么需要了解 Docker 网络?
容器化部署已经成为企业标配,但很多人对 Docker 网络的理解还停留在「能用」层面。当遇到跨主机通信、服务发现、网络隔离等实际问题时,才发现网络配置才是容器编排的核心技能之一。
本文梳理 Docker 网络的四种主流模式,以及生产环境中的最佳实践。
Docker 网络四种模式
1. Bridge 模式(默认)
每个容器分配独立网络命名空间,通过虚拟网桥 docker0 互联。
┌─────────┐ ┌─────────┐
│ Container │ │ Container │
│ 172.17.0.2│ │ 172.17.0.3│
└────┬─────┘ └────┬─────┘
│ │
└───────┬───────┘
▼
docker0 (bridge)
│
宿主机 eth0
- 适用:单机多容器,开发测试环境
- 特点:开箱即用,容器间通过 IP 通信;端口需
-p映射到宿主机
2. Host 模式
容器直接使用宿主机的网络栈,不创建独立的网络命名空间。
- 适用:对网络性能要求高的场景(如高吞吐量的网络应用)
- 注意:端口不能重复占用,安全性降低
3. None 模式
容器只有 loopback 接口,没有外部网络。适合完全自定义网络的场景。
4. Overlay 模式(跨主机)
基于 VXLAN 封装,实现跨物理主机的容器互通——Docker Swarm / Kubernetes 的基础。
Host A (192.168.1.10) Host B (192.168.1.20)
┌─────────────────┐ ┌─────────────────┐
│ Container Web │ │ Container DB │
│ 10.0.0.2 │──VXLAN──▶│ 10.0.0.3 │
└────────┬────────┘ └────────┬─────────┘
│ │
overlay network overlay network
│ │
eth0 (VXLAN) eth0 (VXLAN)
│ │
└──────── 物理交换机 ─────────┘
常用操作速查
# 创建自定义 bridge 网络(推荐替代默认 bridge)
docker network create my-app-net
# 运行容器指定网络
docker run -d --network my-app-net --name web nginx:alpine
# 同一网络内的容器通过容器名互相访问(内置 DNS)
# 例如 web 容器可以通过 http://db:3306 访问 db 容器
# 查看网络列表
docker network ls
# 检查某网络的详细信息
docker network inspect my-app-net
# 断开/连接容器的网络
docker network disconnect my-app-net web
docker network connect my-app-net web
生产环境建议
1. 别用默认 bridge
默认 bridge 不支持 DNS 解析,只能用 IP 通信。始终创建自定义 bridge 网络。
2. 用 compose 统一管理网络
version: '3.8'
services:
web:
image: nginx:alpine
networks:
- frontend
# 可同时接入多个网络
db:
image: mysql:8.0
networks:
- backend
networks:
frontend:
backend:
3. 跨主机用 overlay + Swarm/K8s
手动配置 VXLAN 太复杂,上规模后直接走容器编排平台。
4. 注意安全组 / 防火墙
容器间的通信在宿主机内部完成,但宿主机之间的 VXLAN 流量需要防火墙放行 UDP 4789 端口。
小结
Docker 网络的本质是 Linux 网络命名空间 + veth pair + bridge/overlay 的组合。理解了这几层抽象,排查容器网络问题就不再黑盒。