【发布时间】:2018-08-02 16:46:45
【问题描述】:
我有一组 tcpdump 记录的 IPv4 流量,我有兴趣将给定的传出连接映射到同一台机器上的原始 Docker 容器。我可以查看 TCP 源端口,但我不清楚如何询问 Docker 哪个容器正在使用该端口。如何才能做到这一点? 谢谢
【问题讨论】:
我有一组 tcpdump 记录的 IPv4 流量,我有兴趣将给定的传出连接映射到同一台机器上的原始 Docker 容器。我可以查看 TCP 源端口,但我不清楚如何询问 Docker 哪个容器正在使用该端口。如何才能做到这一点? 谢谢
【问题讨论】:
我遇到了这个确切的问题,我想知道哪个容器是特定 Postgresql 数据库查询的客户端。这些是我找到作为我感兴趣的 TCP 连接源的容器的步骤。
在 postgres 查询pg_stat_activity 中确定您关心的查询的client_addr 和client_port:
SELECT * FROM pg_stat_activity;
现在你知道了源 ip (client_addr) 你可以 ssh 到这个盒子并确定 docker 使用的网络接口:
ip addr
就我而言,它是docker0。现在我们可以使用数据库连接的源端口(@987654328@)来查找容器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是我们感兴趣的流量来源。
【讨论】: