计算Docker容器的带宽


13

我试图弄清楚如何跟踪来自Docker容器的带宽。

通常,我--uid-owner用作标记来跟踪给定用户的带宽使用情况。但是,即使当我运行所有进程时,docker容器内的用户--uid-owner也无法正常工作。--uid-owner我没有使用,而是尝试仅跟踪来自docker创建的虚拟以太网设备的所有数据包。

但是,这最终也无济于事:无论我如何尝试,都不会捕获任何数据包。

出于绝望,我试图将规则放在所有链条中,但都没有结果。

Chain PREROUTING (policy ACCEPT 3041 packets, 7849454 bytes)
num      pkts      bytes target     prot opt in     out     source               destination
1           0        0 MARK       tcp  --  veth5a36 any     anywhere             anywhere             MARK set 0x1

Chain INPUT (policy ACCEPT 273 packets, 23305 bytes)
num      pkts      bytes target     prot opt in     out     source               destination
1           0        0 MARK       tcp  --  veth5a36 any     anywhere             anywhere             MARK set 0x1

Chain FORWARD (policy ACCEPT 2750 packets, 7821109 bytes)
num      pkts      bytes target     prot opt in     out     source               destination
1           0        0 MARK       tcp  --  any    veth5a36  anywhere             anywhere             MARK set 0x1
2           0        0 MARK       tcp  --  veth5a36 any     anywhere             anywhere             MARK set 0x1
3           0        0            all  --  veth5a36 eth0    anywhere             anywhere             mark match 0x1

Chain OUTPUT (policy ACCEPT 293 packets, 80020 bytes)
num      pkts      bytes target     prot opt in     out     source               destination
1           0        0 MARK       tcp  --  any    veth5a36  anywhere             anywhere             MARK set 0x1

Chain POSTROUTING (policy ACCEPT 3043 packets, 7901129 bytes)
num      pkts      bytes target     prot opt in     out     source               destination
1           0        0 MARK       tcp  --  any    veth5a36  anywhere             anywhere             MARK set 0x1

有人可以告诉我如何成功标记Docker容器中的软件包吗?最好使用,--uid-owner但是我现在会采取任何措施:)

Answers:


4

问题与名称空间有关。Docker使用它们来隔离资源,这也意味着它们不计入主机的总数。

当您iptables在主机上运行时,您基本上只查看主机的名称空间,而对您感兴趣的数据包会被计入容器的名称空间。要变通解决此问题,您可以用来ip netns在主机上但仍在容器的网络名称空间中运行iptables。

首先,ip netns具有一些相反的直观界面。为了附加到现有流程的名称空间(在本例中为您的容器),您必须在/var/run/netns/该流程的名称空间中创建一个链接:

# ln -sf /proc/`docker inspect -f '{{ .State.Pid }}' YOUR_CONTAINER`/ns/net /var/run/netns/SOME_NAME

(您可能必须mkdir /var/run/netns

现在,您可以在容器的命名空间中自由运行iptables了:

# ip netns exec SOME_NAME iptables -L -nv

请注意,这会在容器内输出iptables的规则集,该规则集可能为空。

如果您当前仅使用--uid-owner来拥有每个用户的计数器,那么您甚至不再需要它,因为在这种情况下,链式计数器仅适用于容器,这样就足够了。

最后,您可以清理/var/run/netns

每个用户多个容器

如果每个用户有多个容器,并且希望将它们汇总在一起,则可以使用来启动容器--net=container:OTHER_CONTAINER_FROM_USER,以便合并其名称空间。

这样做的缺点是合并了网络堆栈的所有方面,包括开放的端口,因此同一用户在同一端口上侦听时不能有两个容器。

如果这是一个禁止的限制,则可以稍后分别对容器进行计数并根据uid进行分组。

您可以在此处找到有关此问题的更多信息。


0

不完全是您的要求,但我认为它将完成工作。

引用Docker博客中的内容

接口级计数器

由于每个容器都有一个虚拟以太网接口,因此您可能需要直接检查此接口的TX和RX计数器。

[...]

但是目前,最好的方法是从容器内部检查指标。我不是在谈论在容器中运行特殊代理程序之类的事情。我们将在主机环境中但在容器的网络名称空间内运行可执行文件。

该命令的确切格式为:

ip netns exec <nsname> <command...>

例如:

ip netns exec mycontainer netstat -i


2
我对您的答案进行了重新格式化,尝试在以后的答案中以类似的方式引用资源,以使其更加有用。
fuero 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.