通常我使用--uid-owner作为标记来跟踪给定用户的带宽使用情况。 但是,即使当我运行所有的进程作为docker容器内的用户--uid-owner不起作用。 而不是使用--uid-owner ,我试着跟踪所有来自docker创build的虚拟以太网设备的数据包。
然而,这最终也没有做任何事情:不pipe我尝试什么,都没有发现数据包。
绝望之余,我试着把规则放在所有的链条上,但都没有结果。
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但我会采取任何在这一点:)
问题与名称空间有关。 Docker使用它们来隔离资源,这也意味着它们不计入主机的总数。
当你在主机上运行iptables时,你基本上只查看主机的命名空间,而你感兴趣的数据包被logging到容器的命名空间中。 要解决这个问题,你可以使用ip netns来在主机上运行iptables,但是在容器的networking命名空间中。
首先, ip netns有一个有点直观的界面。 为了附加到现有进程的名称空间(在本例中为您的容器),必须在/var/run/netns/中为进程的名称空间创build一个链接:
# 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启动容器,以便合并它们的名称空间。
这有合并networking堆栈的所有方面的缺点,包括开放的端口,所以你不能有同一个用户监听同一个端口的两个容器。
如果这是一个禁止性的限制,你可以在稍后根据uid个别地分组容器。
你可以在这里find更多关于这个问题的信息 。
不完全是你问的,但我认为这将完成工作。
从Docker博客引用:
接口级计数器
由于每个容器都有一个虚拟以太网接口,因此您可能需要直接检查该接口的TX和RX计数器。
[…]
但现在,最好的方法是检查容器内的指标。 我不是说在容器中运行一个特殊的代理,或者类似的东西。 我们将从主机环境运行一个可执行文件,但是在一个容器的networking命名空间中运行。
命令的确切格式是:
ip netns exec <nsname> <command...>例如:
ip netns exec mycontainer netstat -i