libnetwork作为Docker的网络组件库,实现了CNM(Container Network Model)模型,提供了五种核心网络驱动模式。每种模式都对应着不同的网络隔离需求和性能特征。
bridge是Docker的默认网络驱动,其工作原理如下:
典型应用场景:
配置示例:
bash复制# 查看默认bridge网络配置
docker network inspect bridge
注意:默认bridge网络中的容器只能通过IP互相访问,无法使用容器名称进行DNS解析
host驱动完全跳过Docker的网络隔离,直接使用宿主机的网络栈。其特点包括:
性能对比测试:
| 网络模式 | 延迟(ms) | 吞吐量(Gbps) | CPU占用率 |
|---|---|---|---|
| bridge | 0.12 | 2.1 | 5.2% |
| host | 0.05 | 9.8 | 1.8% |
适用场景:
overlay驱动通过VXLAN技术实现跨主机的容器网络,核心组件包括:
典型配置:
bash复制# 创建overlay网络
docker network create -d overlay --subnet=10.0.0.0/24 my-overlay
常见问题排查:
remote驱动实现了Docker网络的插件化架构,允许集成第三方网络方案,如:
开发自定义驱动需要实现以下接口:
null驱动提供"空白画布"式的网络环境:
典型使用模式:
bash复制docker run --network none --privileged -it alpine
# 容器内手动配置网络
ip link add veth0 type veth peer name veth1
完整命令参考表:
| 命令 | 功能 | 常用参数 |
|---|---|---|
| connect | 连接容器到网络 | --ip, --alias |
| create | 创建新网络 | -d(驱动类型), --subnet, --gateway |
| disconnect | 断开网络连接 | -f(强制) |
| inspect | 查看网络详情 | -f(格式化输出) |
| ls | 列出所有网络 | --filter, --quiet |
| prune | 清理未使用网络 | --force |
| rm | 删除指定网络 | -f(强制) |
高级网络创建示例:
bash复制docker network create \
--driver=bridge \
--subnet=192.168.100.0/24 \
--gateway=192.168.100.1 \
--ip-range=192.168.100.128/25 \
--label=env=prod \
prod-net
bash复制docker run -d \
--network=mynet \
--ip=172.11.1.100 \
nginx:alpine
注意:静态IP必须在创建网络时指定的IP范围内
bash复制# 容器运行时连接主网络
docker run -d --network=frontend --name=web nginx
# 运行后添加后端网络
docker network connect backend web
验证网络配置:
bash复制docker exec web ip addr show
bash复制# 查看宿主机路由
route -n
# 容器内路由查看
docker exec -it mycontainer ip route
典型路由表示例解读:
code复制172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
表示所有目标为172.17.0.0/16的流量都会通过docker0接口转发
bash复制iptables -L -n -v --line-numbers
iptables -t nat -L -n -v
关键链说明:
创建优化参数的bridge网络:
bash复制docker network create \
--driver bridge \
--opt "com.docker.network.bridge.name"="mybridge" \
--opt "com.docker.network.bridge.enable_ip_masquerade"="true" \
--opt "com.docker.network.bridge.mtu"="1500" \
custom-bridge
关键参数说明:
bash复制docker run --network=host \
--device /dev/vhost_net \
--cap-add=NET_ADMIN \
nginx
bash复制docker run --cpuset-cpus="0-3" \
--network=host \
nginx
性能优化前后对比:
| 优化项 | 请求处理能力(QPS) | 延迟(p99) |
|---|---|---|
| 默认配置 | 12,000 | 45ms |
| 多队列+亲和性 | 28,000 | 18ms |
bash复制docker network create \
--opt "com.docker.network.bridge.enable_icc"="false" \
isolated-net
bash复制docker run -d \
--network=mynet \
--ulimit nofile=1024:1024 \
--sysctl net.core.somaxconn=1024 \
nginx
排查步骤:
iptables -t nat -L -ndocker exec -it cat /etc/resolv.confdocker exec -it ping 8.8.8.8解决方案:
优化方案:
sysctl -w net.ipv4.tcp_tw_reuse=1sysctl -w net.ipv4.tcp_congestion_control=bbr解决方法:
推荐监控指标:
Prometheus配置示例:
yaml复制- job_name: 'docker-net'
static_configs:
- targets: ['docker-host:9323']
在实际生产环境中,我们发现合理配置Docker网络参数可以解决80%以上的网络性能问题。特别是在高密度容器部署场景下,提前规划子网划分和做好网络隔离至关重要。