要精细分析业务流量,需分层利用docker底层结构:先定位容器veth接口与netns,再通过nsenter读取内核statistics字节统计,结合docker inspect打标业务维度,最后可用ss做五元组会话快照分析。

要对业务访问流量做精细分析,不能只看容器“有没有流量”,而要能区分来源、目标、协议、端口、方向和时间粒度。Docker 原生网络机制本身不提供深度包解析能力,但它的底层结构(veth pair、network namespace、cgroups)为精准采集提供了可靠入口。关键在于分层利用:用网络命名空间定位真实接口,用内核统计获取字节级原始数据,再结合标签与上下文做语义还原。
定位容器真实网络接口(veth + netns)
每个容器在宿主机上都对应一个 veth 设备(如 vetha1b2c3)和一个独立的网络命名空间。这是所有精细分析的起点:
- 查容器 IP 和 MAC:docker inspect myapp | grep -A 5 "NetworkSettings"
- 反查 veth 名称:ls -l /sys/class/net/veth*/address 2>/dev/null | grep
(输出中路径末尾即 veth 名) - 确认命名空间路径:docker inspect -f '{{.NetworkSettings.SandboxKey}}' myapp(如 /var/run/docker/netns/abc123)
- 验证是否可达:nsenter -t $(docker inspect -f '{{.State.Pid}}' myapp) -n ip addr show eth0
采集原始流量数据(零侵入、高精度)
绕过用户态代理或抓包工具,直接读取内核暴露的统计文件,延迟低、无开销、不丢包:
- 查容器接收字节数(下行/请求流入):nsenter -t
-n cat /sys/class/net/eth0/statistics/rx_bytes - 查发送字节数(上行/响应流出):nsenter -t
-n cat /sys/class/net/eth0/statistics/tx_bytes - 若需按协议或端口拆分,可配合 ss -i -tuln 或 cat /proc/
/net/snmp 补充上下文 - 两次采样间隔 1 秒,差值即为该秒流量(单位字节),除以 1024 再除以 1024 得 MB/s
打标与关联业务维度(让流量可读)
原始字节数没有业务意义,必须绑定容器元数据才能用于分析:
- 用 docker inspect 提取 Labels(如 com.example.service=api、env=prod)
- 将容器名、服务标签、网络模式(bridge/host)、端口映射(Ports 字段)与实时流量数值打点存储
- 例如:某次采集到 rx_bytes = 12847293,同时查得该容器 label 为 role=frontend、映射了 80->8080,即可归类为“生产环境前端 HTTP 入口流量”
- 推荐用轻量脚本每 5 秒采集一次,写入本地时序数据库(如 InfluxDB)或推送至 Prometheus(通过 node_exporter textfile collector)
进阶:按连接五元组做会话级分析
如果需识别具体访问来源(如某 IP 调用了多少次 /login),需进入容器网络命名空间抓连接快照:
- 执行:nsenter -t
-n ss -tuln 查当前监听与连接 - 加 -i 参数显示重传、RTT、接收队列等指标:ss -ti src :8080
- 配合 awk 统计源 IP 分布:ss -tn state established '( dport = :8080 )' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
- 注意:该方式是瞬时快照,非持续流控;如需长期会话追踪,建议在应用层打日志并统一接入 ELK 或 Loki











