找出哪个网络接口属于docker容器

时间:2016-06-16 13:37:25

标签: networking docker ifconfig

Docker会在 <div class="form-group"> <label class="col-sm-2 control-label">Multiselect</label> <div class="col-sm-10"> <div id="theParentx"> <select id="example-post-checkboxName" name="multiselect[]" aria-labelledby="dropdownMenu3" multiple="multiple" required> </select> <div id="theChildx" class="dropdown-menu"> <input /> </div> </div> </div> </div> <div class="form-group"> <div class="col-sm-offset-2 col-sm-10"> <button type="submit" class="btn btn-default input-group-addon">Submit</button> </div> </div> 中创建这些虚拟以太网接口veth[UNIQUE ID]。如何找出哪个接口属于特定的docker容器?

我想听tcp流量。

4 个答案:

答案 0 :(得分:8)

找到界面
在我的例子中,从容器获取值就像(检查eth0到):

$ docker exec -it my-container cat /sys/class/net/eth1/iflink
123

然后:

$ ip ad | grep 123
123: vethd3234u4@if122: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker_gwbridge state UP group default

选中tcpdump -i vethd3234u4

来自http://lxr.free-electrons.com/source/Documentation/ABI/testing/sysfs-class-net的神秘iflink的参考:

150 What:           /sys/class/net/<iface>/iflink
151 Date:           April 2005
152 KernelVersion:  2.6.12
153 Contact:        netdev@vger.kernel.org
154 Description:
155                 Indicates the system-wide interface unique index identifier a
156                 the interface is linked to. Format is decimal. This attribute is
157                 used to resolve interfaces chaining, linking and stacking.
158                 Physical interfaces have the same 'ifindex' and 'iflink' values.

答案 1 :(得分:0)

基于提供的答案(对我有用),我制作了一个简单的bash脚本:

#!/bin/bash

export containers=$(sudo docker ps --format "{{.ID}}|{{.Names}}")
export interfaces=$(sudo ip ad);
for x in $containers
        do
                export name=$(echo "$x" |cut -d '|' -f 2);
                export id=$(echo "$x"|cut -d '|' -f 1)
                export ifaceNum="$(echo $(sudo docker exec -it "$id" cat /sys/class/net/eth0/iflink) | sed s/[^0-9]*//g):"
                export ifaceStr=$( echo "$interfaces" | grep $ifaceNum | cut -d ':' -f 2 | cut -d '@' -f 1);
                echo -e "$name: $ifaceStr";
done

答案 2 :(得分:0)

我的回答更像是对这个重要主题的改进,因为它对“找出属于 docker 容器的网络接口”没有帮助,但是,正如作者所注意到的,他“想要监听 docker 容器内的 tcp 流量 - 在您对网络进行故障排除期间,我会尽力帮助解决这个问题。

考虑到 veth 网络设备是关于网络命名空间的,知道我们可以通过 nsenter 工具在另一个命名空间中执行程序如下(记住 - 你需要特权权限(sudo/根)这样做):

获取您有兴趣捕获流量的任何容器的 ID,例如它将是 78334270b8f8

然后我们需要获取该容器化应用程序的 PID(我假设您在容器内仅运行 1 个与网络相关的进程并希望捕获其流量。否则,这种方法很难适用):< /p>

sudo docker inspect 78334270b8f8 | grep -i pid

例如,pid 的输出将是 111380 - 这是您的容器化应用程序的 ID,出于好奇,您也可以通过 ps 命令查看它:ps aux | grep 111380

下一步是检查您的容器内有哪些网络接口:

sudo nsenter -t 111380 -n ifconfig

此命令将返回容器化应用的网络命名空间中的网络设备列表(您的容器上不应有 ifconfig 工具,只能在您的节点/机器上)

例如,您需要使用以下命令捕获接口 eth2 上的流量并将其过滤到 tcp 目标端口 80(当然可能会有所不同):

sudo nsenter -t 111380 -n tcpdump -nni eth2 -w nginx_tcpdump_test.pcap 'tcp dst port 80'

请记住,在这种情况下,您不需要在容器内安装 tcpdump 工具。

然后,在捕获数据包后,.pcap 文件将在您的机器/节点上可用并使用您喜欢的任何工具读取它tcpdump -r nginx_tcpdump_test.pcap

方法的优点:

  • 无需在容器内安装网络工具,只需在 docker 节点上
  • 无需在容器和节点中搜索网络设备之间的映射

缺点:

  • 您需要在节点/机器上拥有特权用户才能运行 nsenter 工具

答案 3 :(得分:0)

@pbaranski 解决方案的单行

num=$(docker exec -i my-container cat /sys/class/net/eth0/iflink | tr -d '\r'); ip ad | grep -oE "^${num}: veth[^@]+" | awk '{print $2}'

如果您需要查找不包含 cat 的容器,请尝试使用此工具:https://github.com/micahculpepper/dockerveth