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流量。
答案 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
方法的优点:
缺点:
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