我收集了tcpdump记录的IPv4流量集合,并且我有兴趣将给定的传出连接映射到同一台机器上的原始Docker容器。我可以查看TCP源端口,但是我不清楚如何询问Docker哪个容器正在使用此端口。如何才能做到这一点? 谢谢
答案 0 :(得分:0)
您可以filter个发布或公开给定端口的容器:
docker ps --filter=expose=3306
或使用format开关获取具有已使用端口的容器ID列表:
docker ps --format "{{.ID}}: {{.Ports}}"
答案 1 :(得分:0)
我有一个确切的问题,我想知道哪个容器是特定Postgresql数据库查询的客户端。这些是我为找到我感兴趣的TCP连接源所采取的步骤。
在postgres查询pg_stat_activity
中,确定您关注的查询的client_addr
和client_port
:
SELECT * FROM pg_stat_activity;
现在您知道源ip(client_addr
)了,您可以切换到此框并确定docker使用的网络接口:
ip addr
在我的情况下是docker0
。现在,我们可以使用数据库连接的源端口(client_port
)查找容器ip地址:
tcpdump -i docker0 src port 52282
02:41:16.257106 IP 172.17.0.15.52282 > 192.168.2.119.postgres: Flags [P.] ...
现在,我们需要确定此源IP(172.17.0.15
)属于哪个容器,为此,我们可以使用带有过滤器的docker inspect命令:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container
我们为每个正在运行的容器循环运行此命令,并为要查找的ip循环运行grep:
for name in $( docker ps --format '{{.Names}}' ); do echo -n "$name => " && docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $name; done | grep 172.17.0.15
my-container => 172.17.0.15
现在,我们知道容器my-container
是我们感兴趣的流量的来源。