如何抓包单个docker容器

问题描述 投票:0回答:5

主机上运行着很多容器。我想捕获其中一个容器的数据包。有什么办法可以做到这一点吗?

networking docker
5个回答
38
投票

您可以将一个容器的网络命名空间绑定到另一个容器:

docker run -it --rm --net container:<container_name> \
  nicolaka/netshoot tcpdump ...

要了解有关上面使用的 netshoot 图像的更多信息,请参阅:https://github.com/nicolaka/netshoot


37
投票

来自带有 Wireshark 的工作站以及适用于带有 Wireshark 的工作站:

docker exec -ti <container id> cat /sys/class/net/eth0/iflink

28
ip link | grep 28

28: veth11b0a6c@if27: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default


19
投票
  • 首先,获取您感兴趣的容器的

    pid

    docker inspect --format "{{ .State.Pid }}" "$CONTAINER_ID"
    
  • 然后输入相同的网络命名空间

    nsenter -n -t "$PID"
    
  • 最后,运行

    tcpdump


1
投票

在极少数情况下(或者当您创建自己的容器映像时)容器可能安装了 tcpdump。在这种情况下,您可以发出以下命令将 10 秒的捕获保存到主机(容器外部):

# Set CONATINER_ID to the process you want to perform a dump from
# Consider docker ps for finding the container id
# for example, CONTAINER_ID=$( docker ps | grep $IMAGE | awk '{print $1}' )
docker exec $CONTAINER_ID bash -c 'timeout 10 tcpdump -i eth0 -w /dev/stdout' > capture.pcap

0
投票

无需任何 CLI 舞蹈的一键式解决方案:

  1. 部署发现和捕获服务:Edgeshark
  2. 安装 Wireshark 插件以使用捕获服务:cshargextcap
© www.soinside.com 2019 - 2024. All rights reserved.