在添加新的veth界面时运行脚本

Docker为每个创build的容器创build一个连接到桥( docker0 )的veth接口。

http://docs.docker.io/use/networking/

我想限制这些新的veth接口的带宽。 我find了一个与奇迹般的做法。 不过,我想自动化这一点。

有没有办法让钩子在每次连接一个新的veth接口时运行一个脚本?

我已经研究过在/etc/network/if-up.d/添加脚本,但是只有在启动时veth添加veth

以下是我想要通知的一些系统日志。 我知道我可以尾巴这些日志,但是这种方法似乎有点哈克,必须有一种方式通过操作系统得到这个事件的通知。

 May 2 23:28:41 ip-10-171-7-2 kernel: [22170163.565812] netlink: 1 bytes leftover after parsing attributes. May 2 23:28:42 ip-10-171-7-2 kernel: [22170163.720571] IPv6: ADDRCONF(NETDEV_UP): veth5964: link is not ready May 2 23:28:42 ip-10-171-7-2 kernel: [22170163.720587] device veth5964 entered promiscuous mode May 2 23:28:42 ip-10-171-7-2 avahi-daemon[1006]: Withdrawing workstation service for vethdc8c. May 2 23:28:42 ip-10-171-7-2 kernel: [22170163.743283] IPv6: ADDRCONF(NETDEV_CHANGE): veth5964: link becomes ready May 2 23:28:42 ip-10-171-7-2 kernel: [22170163.743344] docker0: port 27(veth5964) entered forwarding state May 2 23:28:42 ip-10-171-7-2 kernel: [22170163.743358] docker0: port 27(veth5964) entered forwarding state May 2 23:28:48 ip-10-171-7-2 kernel: [22170170.518670] docker0: port 26(vethb06a) entered forwarding state May 2 23:28:57 ip-10-171-7-2 kernel: [22170178.774676] docker0: port 27(veth5964) entered forwarding state 

Solutions Collecting From Web of "在添加新的veth界面时运行脚本"

你应该写一个自定义的udev规则,在每次添加一个新的接口时运行你的脚本。 这就是Debian为处理界面“hotplug”所做的事情。

/etc/udev/rules.d/90-my-networking.rules

 SUBSYSTEM=="net", RUN+="/usr/local/bin/my-networking-agent.sh" 

/usr/local/bin/my-networking-agent.sh

 #!/bin/sh logger "hey I just got interface ${INTERFACE} with action ${ACTION}" 

编辑

以下是你如何测试它:

 # modprobe dummy0 # ifconfig dummy0 up # tail -n1 /var/log/syslog May 3 01:48:06 ernst logger: hey I just got interface dummy0 with action add 

udev规则是这样做的方法之一,然而在那里信息有一些缺乏,即没有可靠和简单的方法来知道veth与哪个容器相关联。 我不确定在你的情况下是否足够简单地设置veth对的主机端的带宽限制,这可能是停止,但也有另一端在容器的命名空间,这是你可以看使用ip netnsnsenter命令。 所以,如果你需要在veth对的两端进行操作,最好有容器ID,所以你可以查找PID和与之相关的网络命名空间。 一种方法是运行docker events并解析它的输出,而更好的方法是使用Docker的域套接字API。 对于我以前的用例来说,将docker events出来就足够了,这是我写的一个脚本,它是在容器内添加一个路由,并使用ethtool关闭校验和卸载。

 #!/bin/sh -x [ ! $# = 2 ] && exit 1; container_interface="$1" add_route="$2" docker events | while read event do echo $event | grep -q -v '\ start$' && continue container_id=`echo $event | sed 's/.*Z\ \(.*\):\ .*/\1/'` nsenter="nsenter -n -t {{ .State.Pid }} --" ip_route_add="ip route add ${add_route} dev ${container_interface} proto kernel scope link src {{ .NetworkSettings.IPAddress }}" ethtool_tx_off="ethtool -K ${container_interface} tx off >/dev/null" eval `docker inspect --format="${nsenter} ${ip_route_add}; ${nsenter} ${ethtool_tx_off};" ${container_id}` done 

除了docker events ,还有另一种使用ip monitor命令捕捉网络事件的方法。 但是,这样您仍然没有容器ID,类似于udev方法。