容器网络排查工具箱
netshoot(nicolaka/netshoot)是容器网络排查常用的工具镜像,内置 dig、nslookup、tcpdump、curl、ss、ip、iptables、nc 等全套网络工具。它的关键用法是共享目标容器的网络与进程命名空间,这样看到的网卡、路由、DNS 配置与故障容器完全一致,既不用往生产镜像里塞工具,也不用改动原容器的运行状态。
基本信息
| 镜像 | nicolaka/netshoot,打包了常用网络与排查工具 |
|---|---|
| 共享网络 | --network container:<目标容器>,共享后不能再指定端口映射 |
| 常用动作 | 查 DNS、测四层连通性、抓包、看监听端口与路由 |
| K8s 用法 | kubectl run netshoot --rm -it --image=nicolaka/netshoot -- sh |
| 采集与输出 | 抓包写到挂载的宿主目录,排查结束再拷出分析 |
| 权限 | 抓包需要网络原始套接字能力,默认镜像具备 |
典型使用场景
- 容器内 DNS 解析异常:在同一网络命名空间里用同样的配置验证解析结果
- 应用连不上依赖:先用 nc 验证四层可达,再往上查 TLS 与协议层
- 抓包分析丢包、重传、连接被拒,定位是客户端还是服务端的问题
- 查看容器内实际监听端口与路由表,比读配置文件更可靠
- 对照排查跨节点网络问题:对比源容器与目标容器两侧的抓包结果
使用示例
使用示例
docker run --rm -it --network container:myapp --pid container:myapp nicolaka/netshoot
dig +short db # 用容器的 DNS 配置查解析
nc -vz db 3306 # 四层连通性验证
tcpdump -i any -nn port 3306 -c 50 -w /tmp/db.pcap # 抓 50 个包,-nn 不做名称反查
ss -lntp # 看容器内监听端口
ip route # 看路由表与默认网关常用输出读法
| 输出项 | 含义 | 异常表现 |
|---|---|---|
| ss 的 Recv-Q | 接收队列积压字节数 | 持续不为 0 说明应用没有及时读取 |
| ss 的 Send-Q | 发送队列积压 | 持续增大说明对端处理慢或带宽受限 |
| Local Address:Port | 监听地址与端口 | 只监听 127.0.0.1 时外部无法访问 |
| tcpdump 的 flags | TCP 标志位 | 只有 SYN 没有 SYN-ACK 说明被拒或被丢弃 |
| tcpdump 的 length | 包长度 | 结合 MTU 判断是否发生分片或大包被丢 |
排查「应用连不上依赖」时,先在同网络命名空间里用 nc -vz host port 验证四层可达,再往上查 TLS 与协议层。四层不通就继续在两侧抓包,四层通不通的问题分开处理,能立刻把网络问题与应用问题区隔开。
抓包文件默认落在容器的临时路径,配合 --rm 时容器退出文件即丢失。开始抓包前先用 -v 挂载宿主目录,并确认节点磁盘空间充足,避免把节点写满。