Docker 网络深度解析:从 bridge、host 到 overlay 与自定义网络实战 原创
Docker 网络深度解析:从 bridge、host 到 overlay 与自定义网络实战
Docker 的网络模型是容器编排的基础,理解其底层机制对排查网络问题、构建多容器架构至关重要。本文从最基础的 bridge 网络出发,逐层深入到 host、none、overlay 以及自定义网络的配置与实战,帮助你建立完整的 Docker 网络知识体系。
一、Docker 网络架构总览
Docker 安装时会自动创建三个默认网络:bridge、host 和 none。默认的 bridge 网络为每个容器提供独立的网络命名空间,通过 NAT 实现对外通信;host 网络直接复用宿主机网络栈;none 则完全隔离网络。理解这三个网络是掌握 Docker 网络的第一步。
docker network ls
NETWORK ID NAME DRIVER SCOPE
f2e1c5b6d1a4 bridge bridge local
6d9a3c4e1b28 host host local
8f7e2b1a5c3d none null local
二、默认 bridge 网络的工作原理
默认 bridge 网络创建在宿主机上的 docker0 虚拟网桥上。每个容器通过 veth 虚拟网卡连接到 docker0,形成一个二层的隔离网络。容器之间可以通过 IP 直接通信,但与外部通信时需要通过 iptables 做 NAT 转换。
# 查看 docker0 网桥
ip addr show docker0
# 查看容器的网络命名空间
docker inspect --format '{{.NetworkSettings.IPAddress}}' <container_id>
默认 bridge 网络的局限在于:容器之间的通信依赖 IP 地址,一旦容器重建 IP 就会变化。因此,生产环境通常推荐创建自定义 bridge 网络,利用 Docker 内置的 DNS 实现容器名解析。
三、自定义 bridge 网络与容器间通信
自定义 bridge 网络不仅提供自动 DNS 解析,还支持更精细的端口映射和子网划分。创建自定义网络后,同一网络内的容器可以直接通过容器名访问,这是微服务架构的首选方案。
# 创建自定义网络
docker network create --driver bridge --subnet 172.20.0.0/16 app-network
# 两个容器加入同一网络
docker run -d --name web --network app-network nginx
docker run -d --name db --network app-network mysql:8
# 在 web 容器内通过容器名访问 db
docker exec web ping db
四、host 与 none 网络的使用场景
host 网络模式下容器直接共享宿主机网络栈,无 NAT 转发,性能最好,适合对网络性能要求极高的场景,如网络测试工具或需要绑定宿主机端口的特殊应用。但缺点是端口冲突风险高,容器与宿主机无隔离。none 网络则为容器提供完全隔离的网络环境,适合仅需本地回环测试或完全不需要网络的场景。
# host 网络模式
docker run --network host nginx
# none 网络模式
docker run --network none alpine sleep 3600
五、overlay 网络与 Docker Swarm 多机通信
overlay 网络用于跨宿主机通信,是 Docker Swarm 集群的核心网络组件。它基于 VXLAN 封装技术在宿主机之间建立逻辑隧道,使分布在不同节点上的容器如同处于同一局域网。overlay 网络还支持加密选项,保障跨节点通信安全。
# 初始化 Swarm 集群
docker swarm init
# 创建 overlay 网络(默认不加密)
docker network create --driver overlay --attachable app-overlay
# 创建加密的 overlay 网络
docker network create --driver overlay --opt encrypted --attachable secure-overlay
六、端口映射与 iptables 规则
当容器需要对外提供服务时,使用 -p 参数进行端口映射。Docker 通过 DNAT 规则将宿主机端口的流量转发到容器的对应端口。理解 iptables 规则有助于排查端口映射失败、端口被占用等常见问题。
# 端口映射:宿主 8080 -> 容器 80
docker run -d -p 8080:80 nginx
# 查看 NAT 规则
iptables -t nat -L -n | grep 8080
七、Docker 网络故障排查实战
网络故障是容器运维的高频问题。常见排查工具包括 ping、dig、traceroute 以及 Docker 自带的 network inspect。当容器无法访问外网时,优先检查宿主机转发是否开启;当容器间通信失败时,检查是否处于同一自定义网络。
# 检查网络详情
docker network inspect app-network
# 进入容器排查网络
docker exec -it web sh
# 容器内检查 DNS
cat /etc/resolv.conf
nslookup db
八、总结与最佳实践
| 网络模式 | 适用场景 | 核心特性 |
|---|---|---|
| bridge(默认) | 单机容器通信 | NAT 转发,无自动 DNS |
| 自定义 bridge | 微服务架构 | 自动 DNS,网络隔离 |
| host | 高性能需求 | 共享宿主机网络,无隔离 |
| overlay | Swarm 跨主机 | VXLAN 隧道,支持加密 |
最佳实践建议:单机多容器优先使用自定义 bridge 网络并利用容器名通信;跨主机集群使用 overlay 网络并开启加密;对网络性能极端敏感的应用才考虑 host 模式。掌握这些网络模型,你就能在生产环境中从容应对各类容器网络挑战。