起因

本来我想在docker里面做些测试和监控,于是我用到了两个工具tcpdump和strace。想要使用strace就必须开启特权模式,但是我发现开启之后tcpdump就无法使用了。

解释

是因为有个叫做apparmor这个程序导致的。它是控制访问权限的一种系统类似于selinux。但是没有它docker就无法启动容器。我的ubuntu主机安装了tcpdump,容器也安装了tcpdump,当我开启容器里面的tcpdump的时候,会提示没有权限打开共享库。因为apparmor(/etc/apparmor.d/docker)在特权模式下,容器是没有加载/etc/apparmor.d/docker文件的,所以导致了一些比较混乱的问题(具体是为什么我也没找到答案),目前还没有被解决。所以想要搞定这个问题一个比较好的办法是把容器里面的tcpdump的路径换下。例如(Dockerfile)

RUN mv /usr/sbin/tcpdump /usr/local/bin  

参考资料:
https://github.com/docker/docker/issues/5490
http://stackoverflow.com/questions/25533666/cannot-reload-or-start-apparmor-in-docker
https://github.com/docker/docker/issues/5788
https://github.com/docker/docker/issues/7276#issuecomment-50436671