排查docker容器网络丢包,关键不是“容器有没有丢”,而是“包在哪个环节被丢”——veth-pair本身不主动丢包,真正丢包发生在容器内命名空间、宿主机网桥、内核netfilter队列或物理网卡驱动层,需分层验证、逐段比对收发计数和丢弃指标。

排查 Docker 容器网络丢包,关键不是“容器有没有丢”,而是“包在哪个环节被丢”——veth-pair 本身不主动丢包,真正丢包发生在它连接的两端:容器内命名空间、宿主机网桥(docker0 或 cni0)、内核 netfilter 队列,或物理网卡驱动层。必须分层验证,逐段比对收发计数和丢弃指标。
确认 veth-pair 两端状态与配对关系
veth 是容器通信的底层通道,一端在容器内(如 eth0),另一端在宿主机(如 vethabc123)。两者必须成对、UP、MAC 匹配。
- 查容器 PID:
docker inspect -f '{{.State.Pid}}' <container_id></container_id> - 进容器命名空间查 eth0:
nsenter -n -t <pid> -- ip link show eth0</pid>,确认状态为 UP,无 NO-CARRIER - 在宿主机查对应 veth:
ip link | grep "link-netnsid <n>"</n>(N 来自上一步 eth0 的 link-netnsid),找到设备名后执行ip -d link show <veth_name></veth_name>,确认 peer_ifindex 或 MAC 地址与容器内 eth0 一致 - 任一端 DOWN 或配对失败,说明网络初始化异常,需检查 dockerd 日志或重启容器
比对容器侧与宿主机侧 /proc/net/dev 统计
直接读取帧级统计比 ping/iperf 更可靠,能定位丢包发生的具体路径方向。
- 容器内收发:
nsenter -n -t <pid> -- cat /proc/net/dev | grep eth0</pid>,关注 rx_packets、tx_packets、rx_dropped - 宿主机 veth 接口:
cat /proc/net/dev | grep vethabc123,同样看 rx/tx 各项 - 若容器 tx_packets > 宿主机 rx_packets → 丢包在容器 egress 路径(如 iptables OUTPUT DROP、tc qdisc 限速丢包)
- 若宿主机 tx_packets > 容器 rx_packets → 丢包在宿主机 ingress 路径(如 docker0 转发失败、rp_filter 拒绝、netfilter INPUT DROP)
检查网桥、iptables 与内核关键参数
流量经过 docker0 或 CNI 网桥时,常见瓶颈来自 conntrack 溢出、iptables 规则复杂、或反向路径过滤启用。
- 确认 veth 已挂载到网桥:
brctl show docker0或ip link show master docker0 - 查 conntrack 使用率:
cat /proc/sys/net/netfilter/nf_conntrack_count和/proc/sys/net/netfilter/nf_conntrack_max,比值超 90% 易触发丢包 - 检查是否启用 netfilter 桥接:
sysctl net.bridge.bridge-nf-call-iptables,若为 1,所有桥接包都会走 iptables,规则过多会延迟甚至丢包 - 验证 rp_filter:
sysctl net.ipv4.conf.all.rp_filter和net.ipv4.conf.docker0.rp_filter,设为 0 可避免因路由不对称导致的丢包
验证 MTU 是否错配及物理网卡负载
大流量下,MTU 不一致会在封装/解封装环节批量丢包;物理网卡中断或队列溢出也会表现为随机丢包。
- 测路径 MTU:
ping -M do -s 1472 8.8.8.8(1472 + 28 = 1500),不通则逐步减小 -s 值,找出最大有效载荷,加 28 得实际 MTU - 比对各接口 MTU:
ip link show eth0 | grep mtu、ip link show docker0 | grep mtu、ip link show vethxxx | grep mtu,三者必须一致 - 查内核丢包日志:
dmesg | grep -i "too long\|drop",出现 “size 1514 > 1450” 即为 MTU 超限铁证 - 仅当前几层无异常时再查物理网卡:
ethtool -S eth0 | grep -i drop、cat /proc/interrupts | grep eth0,观察中断分布是否偏斜











