主机上运行着很多容器。我想捕获其中一个容器的数据包。有什么办法可以做到这一点吗?
您可以将一个容器的网络命名空间绑定到另一个容器:
docker run -it --rm --net container:<container_name> \
nicolaka/netshoot tcpdump ...
要了解有关上面使用的 netshoot 图像的更多信息,请参阅:https://github.com/nicolaka/netshoot
首先,获取您感兴趣的容器的
pid
docker inspect --format "{{ .State.Pid }}" "$CONTAINER_ID"
然后输入相同的网络命名空间
nsenter -n -t "$PID"
最后,运行
tcpdump
在极少数情况下(或者当您创建自己的容器映像时)容器可能安装了 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
无需任何 CLI 舞蹈的一键式解决方案: