Docker作为容器化技术的代表,其网络架构设计灵活高效,支持从单机到分布式集群的各种场景。本指南基于Docker 26.x+版本(2026年最新),从核心原理入手,逐步深入实战示例,帮助你全面掌握。所有命令示例均在标准Linux环境(Ubuntu 24.04+)验证可运行。如果你使用Windows/macOS,可通过Docker Desktop模拟。
为了直观理解,先来看Docker网络架构的核心图示:
1. Docker网络原理:核心概念与模型
Docker网络基于Linux内核的网络命名空间(Network Namespace)和虚拟设备(如veth pair、bridge),实现容器隔离与通信。默认使用libnetwork(CNM模型)管理。
关键组件
- 网络命名空间:每个容器有独立网络栈(接口、路由、防火墙),隔离进程视图。
- 虚拟设备:
- veth pair:虚拟以太网对,一端连容器,一端连宿主桥。
- Bridge:虚拟交换机,连接多个veth。
- 驱动程序(Drivers):抽象层,支持不同网络类型。
- IPAM(IP Address Management):自动分配IP。
网络类型(Drivers)解析
Docker内置5种网络驱动,适应不同场景:
- Bridge(默认):单机网络。创建docker0桥,容器连入获取私有IP(172.17.0.0/16)。宿主通过NAT访问外部。
- Host:容器共享宿主网络栈,无隔离。性能高,但安全性低。
- None:无网络,仅lo接口。用于隔离容器。
- Overlay:多机网络。基于VXLAN隧道,实现跨宿主通信。需Swarm/K8s支持。
- Macvlan:容器直接用宿主物理网卡MAC/IP,像独立主机。适合高性能场景。
高级扩展:插件驱动如Weave、Calico,支持SDN。
2. 深入剖析:通信流程与高级特性
单机通信(Bridge模式)
- 容器间:通过docker0桥转发。
- 容器-宿主:veth pair桥接。
- 容器-外部:IPTables NAT masquerade。
流程图:容器A → veth → docker0 → IPTables → 宿主eth0 → 互联网。
多机通信(Overlay模式)
- 使用VXLAN封装L2帧,UDP隧道传输。
- 控制平面:etcd/Consul存储节点信息。
- 数据平面: VTEP(VXLAN Tunnel End Point)处理封装/解封。
高级特性
- Service Discovery:内置DNS(127.0.0.11),容器名解析IP。
- Load Balancing:Swarm模式下,Ingress/VIP分发流量。
- Security:Network Policy(via插件)限制流量;加密隧道。
- 性能优化:eBPF加速(如Cilium插件)取代IPTables。
3. 实战指南:从创建到高级配置
假设你已安装Docker(sudo apt install docker.io)。所有命令需sudo或docker组权限。
实战1:基本网络操作(Bridge)
创建自定义桥网络,运行容器并测试连通。
# 创建网络
docker network create mybridge --subnet=192.168.0.0/16
# 运行容器A
docker run -d --name containerA --network mybridge busybox sleep infinity
# 运行容器B
docker run -d --name containerB --network mybridge busybox sleep infinity
# 检查网络
docker network inspect mybridge # 显示IP分配
# 测试连通(从容器A ping B)
docker exec containerA ping -c 3 containerB
输出示例(ping结果):
3 packets transmitted, 3 received, 0% packet loss
实战2:Host模式与端口映射
Host模式容器共享宿主网络。
# 运行Nginx容器(Host模式)
docker run -d --name nginx-host --network host nginx
# Bridge模式端口映射
docker run -d --name nginx-bridge -p 8080:80 nginx
# 测试访问
curl localhost:8080 # Bridge模式
curl localhost:80 # Host模式(需检查端口冲突)
实战3:Overlay多机网络(需Swarm)
初始化Swarm集群(假设两节点:node1, node2)。
# node1: 初始化
docker swarm init --advertise-addr <node1-ip>
# node2: 加入(用node1生成的token)
docker swarm join --token <token> <node1-ip>:2377
# 创建Overlay网络
docker network create -d overlay myoverlay
# 部署服务
docker service create --name myservice --network myoverlay --replicas 2 nginx
# 检查跨节点通信
docker service ps myservice # 查看分布
Overlay网络自动处理隧道,容器间用服务名通信。
实战4:Macvlan高级配置
直接暴露容器到物理网络。
# 创建Macvlan网络(假设eth0为宿主接口)
docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=eth0 mymacvlan
# 运行容器
docker run -d --name mac-container --network mymacvlan --ip=192.168.1.100 busybox sleep infinity
# 测试:从外部ping 192.168.1.100
注意:需宿主网卡支持promiscuous模式。
最佳实践与トラブルシューティング
- 性能:用Host/Overlay避免NAT开销;监控网络瓶颈(docker stats)。
- 安全:自定义网络隔离;用–icc=false禁用容器间通信。
- 常见问题:
- “no route to host”:检查防火墙(ufw allow from 172.17.0.0/16)。
- Overlay失败:确保2377/7946/4789端口开放。
- 工具:docker network ls/prune;Wireshark捕获流量调试。
通过这些原理与实战,你能灵活构建Docker网络。建议在虚拟机多练手,探索插件如CNI for K8s集成。更多细节如自定义IPAM?随时问!🚀