Docker容器Running时可宿主机或容器内抓包:宿主机用tcpdump -i docker0 host 容器IP;进容器需先确认/安装tcpdump,再tcpdump -i eth0;网络命名空间隔离时用nsenter -t PID -n tcpdump。

当Docker容器处于Running状态时,可以直接在宿主机或容器内抓包分析网络流量,关键在于明确抓包位置、选择合适工具,并注意网络命名空间隔离带来的影响。
宿主机上抓取容器流量(推荐初学者)
容器共享宿主机的网络协议栈(bridge模式下通过docker0网桥通信),因此可在宿主机用tcpdump直接捕获进出容器的流量。
- 先查容器IP:docker inspect -f '{{.NetworkSettings.IPAddress}}'
- 再抓指定容器流量:sudo tcpdump -i docker0 host (若使用自定义bridge网络,替换docker0为对应网桥名,如br-xxxx)
- 如需完整HTTP内容,加-A参数;保存为pcap文件便于Wireshark分析,加-w out.pcap
进入容器内部抓包(适合调试应用层行为)
部分容器精简,可能无tcpdump或curl等工具。需先确认基础工具是否存在,或临时安装。
- 交互式进入容器:docker exec -it /bin/sh(或/bin/bash)
- 检查是否含tcpdump:which tcpdump;若无,根据镜像系统安装(如Alpine用apk add tcpdump,Debian系用apt-get update && apt-get install -y tcpdump)
- 直接抓容器本地环回或对外流量:tcpdump -i eth0 port 80(eth0是默认容器网卡名)
处理网络命名空间隔离(高级场景)
某些情况下(如host网络模式、macvlan或CNI插件),容器可能不走docker0,此时需切换到对应网络命名空间抓包。
- 获取容器PID:docker inspect -f '{{.State.Pid}}'
- 用nsenter进入网络命名空间抓包:sudo nsenter -t
-n tcpdump -i any port 443 - 注意:-n 表示进入net namespace;-i any 可捕获所有接口,避免因不确定网卡名而漏包
常见问题与绕过技巧
抓不到包?大概率是接口选错、过滤条件过严,或容器根本没发流量。
- 容器用localhost通信(如Redis连接127.0.0.1)→ 宿主机tcpdump看不到,必须进容器抓eth0或lo(加-i lo)
- 抓包显示“no suitable device found”→ 检查接口名是否正确,可用ip link show在容器或宿主机中确认
- 想实时看HTTP请求头?用tcpdump -i docker0 -A 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)>2)) != 0)'粗略过滤HTTP载荷(更稳推荐用mitmproxy或容器内curl -v)










