15.6.1 Docker网络驱动与模型概述
Docker网络驱动与模型概述#
Docker 网络由“网络命名空间 + veth pair + Linux 网桥/隧道 + iptables 规则”构成,通过不同网络驱动实现隔离与互通。容器默认运行在独立 network namespace 中,拥有各自的 IP、路由表与端口,借助 veth pair 与宿主机网络栈连接。
原理草图(默认 bridge)#
网络驱动类型与适用场景(含示例)#
-
bridge(默认):单宿主机容器互通,NAT 访问外网
示例:创建 bridge 网络并运行容器
bash docker network create -d bridge app-net docker run -d --name web --network app-net nginx:1.25 docker run -it --rm --network app-net busybox:1.36 ping -c 2 web # 预期:busybox 能解析并 ping 通 web -
host:共享宿主机网络命名空间,性能高、隔离弱
bash docker run -d --name host-nginx --network host nginx:1.25 ss -lntp | grep 80 # 预期:直接看到宿主机 80 端口被 nginx 占用 -
none:不配置网络,仅 loopback
bash docker run -it --rm --network none busybox:1.36 ip a # 预期:只看到 lo -
overlay:跨主机通信(需 Swarm/K8s),适合多节点
bash docker swarm init docker network create -d overlay ov-net # 预期:overlay 网络创建成功,可用于多节点服务 -
macvlan:容器直接接入二层网络
bash docker network create -d macvlan \ --subnet=192.168.10.0/24 --gateway=192.168.10.1 \ -o parent=eth0 macvlan-net docker run -d --name macvlan-nginx --network macvlan-net nginx:1.25 # 预期:容器获取 192.168.10.0/24 地址
核心概念与命令解释#
-
网络命名空间(netns):隔离容器网络栈
bash # 查看容器进程对应的网络命名空间 PID=$(docker inspect -f '{{.State.Pid}}' web) ls -l /proc/$PID/ns/net -
veth pair:成对虚拟网卡将容器与宿主机桥接
bash ip link | grep veth # 预期:看到 vethxxxx@ifY 形式设备 -
Linux Bridge(docker0):默认桥接
bash ip addr show docker0 bridge link -
iptables/NAT:端口映射与出站访问
bash iptables -t nat -L -n | sed -n '1,80p' # 关注 DOCKER 链与 DNAT/SNAT 规则
数据流路径示例#
-
容器内访问外网
bash docker run -it --rm busybox:1.36 sh -c "ip r; ping -c 2 8.8.8.8" # 预期:默认路由指向 docker0 网关 -
外部访问容器端口(端口映射)
bash docker run -d --name webp -p 8080:80 nginx:1.25 curl -I http://127.0.0.1:8080 # 预期:返回 HTTP/1.1 200 OK
安装与验证(网络工具补齐)#
# Debian/Ubuntu
apt-get update && apt-get install -y iproute2 iptables bridge-utils
# CentOS/RHEL
yum install -y iproute iptables-services bridge-utils
排错与诊断清单(含命令)#
-
容器无法出网
- 检查 NAT 规则
bash iptables -t nat -S | grep -E 'MASQUERADE|DOCKER'
- 检查宿主机转发
bash sysctl net.ipv4.ip_forward # 需为 1 -
容器间无法互通(同网络)
- 检查容器网络
bash docker network inspect app-net
- 检查防火墙拦截
bash iptables -L -n | sed -n '1,80p' -
端口映射不通
- 检查容器内服务监听
bash docker exec webp ss -lntp
- 检查宿主机端口占用
bash ss -lntp | grep 8080
小结与运维关注点#
- 驱动选型要匹配部署规模与性能目标(单机选 bridge,多主机选 overlay)。
- NAT 与端口映射应纳入安全策略与审计。
- 多网络并存时需确认容器默认路由与 DNS 解析逻辑。
练习#
- 在同一宿主机创建自定义 bridge 网络,让两个容器互通并互相 ping。
- 用
--network host运行 Nginx,比较端口监听与 bridge 模式差异。 - 通过
docker network inspect输出解析容器 IP、网关与连接列表。 - 关闭
net.ipv4.ip_forward后验证容器出网失败,并恢复。