如何监视从非root用户的docker容器日志?

我想监视非root用户(td-agent)和主机服务器上的docker容器日志,

sudo chmod o+rx /var/lib/docker sudo find /var/lib/docker/containers/ -type d -exec chmod o+rx {} \; sudo find /var/lib/docker/containers/ -type f -exec chmod o+r {} \; 

但容器目录回滚600和每个容器目录保持600。

 # find /var/lib/docker/containers -ls 143142 4 drwx------ 4 root root 4096 Aug 14 12:01 /var/lib/docker/containers 146027 4 drwx------ 2 root root 4096 Aug 14 12:00 /var/lib/docker/containers/145efa73652aad14e1706e8fcd1597ccbbb49fd756047f3931270b46fe01945d 146031 4 -rw-r--r-- 1 root root 190 Aug 14 12:00 /var/lib/docker/containers/145efa73652aad14e1706e8fcd1597ccbbb49fd756047f3931270b46fe01945d/hostconfig.json 146046 4 -rw-r--r-- 1 root root 13 Aug 14 12:00 /var/lib/docker/containers/145efa73652aad14e1706e8fcd1597ccbbb49fd756047f3931270b46fe01945d/hostname 146047 4 -rw-r--r-- 1 root root 174 Aug 14 12:00 /var/lib/docker/containers/145efa73652aad14e1706e8fcd1597ccbbb49fd756047f3931270b46fe01945d/hosts 146030 4 -rw-r--r-- 1 root root 3305 Aug 14 12:00 /var/lib/docker/containers/145efa73652aad14e1706e8fcd1597ccbbb49fd756047f3931270b46fe01945d/config.json 146049 4 -rw------- 1 root root 1853 Aug 14 12:00 /var/lib/docker/containers/145efa73652aad14e1706e8fcd1597ccbbb49fd756047f3931270b46fe01945d/145efa73652aad14e1706e8fcd1597ccbbb49fd756047f3931270b46fe01945d-json.log 146050 4 drwx------ 2 root root 4096 Aug 14 12:01 /var/lib/docker/containers/f09796f978ef5bab1449d2d10d400228eb76376579e7e33c615313eeed53f370 146054 4 -rw-r--r-- 1 root root 190 Aug 14 12:01 /var/lib/docker/containers/f09796f978ef5bab1449d2d10d400228eb76376579e7e33c615313eeed53f370/hostconfig.json 146056 4 -rw-r--r-- 1 root root 13 Aug 14 12:01 /var/lib/docker/containers/f09796f978ef5bab1449d2d10d400228eb76376579e7e33c615313eeed53f370/hostname 146057 4 -rw-r--r-- 1 root root 174 Aug 14 12:01 /var/lib/docker/containers/f09796f978ef5bab1449d2d10d400228eb76376579e7e33c615313eeed53f370/hosts 146053 4 -rw-r--r-- 1 root root 3286 Aug 14 12:01 /var/lib/docker/containers/f09796f978ef5bab1449d2d10d400228eb76376579e7e33c615313eeed53f370/config.json 146058 4 -rw------- 1 root root 1843 Aug 14 12:01 /var/lib/docker/containers/f09796f978ef5bab1449d2d10d400228eb76376579e7e33c615313eeed53f370/f09796f978ef5bab1449d2d10d400228eb76376579e7e33c615313eeed53f370-json.log 

如何监视这个每个json.log ? 还是其他好的监控方式?

logspout是收集容器logs. I'm not sure this is the best solution, but it is very interesting and consistent way to collect containers另一种方法logs. I'm not sure this is the best solution, but it is very interesting and consistent way to collect containers logs. I'm not sure this is the best solution, but it is very interesting and consistent way to collect containers日志。

你只需要运行logspout容器。 此容器具有将泊坞窗容器的日志发送到其他系统日志服务器的function。 (或者你也可以使用HTTP API也可以参见repository )

 # (172.17.42.1 is host ip address) $ docker run -v=/var/run/docker.sock:/tmp/docker.sock progrium/logspout syslog://172.17.42.1:5140 

在主机上运行的fluentd可以通过syslog协议处理这些日志。 下面是td-agent.conf的例子。 它从系统日志协议接收日志并将其发送到elasticsearch服务器。 (检查这个例子项目 )

 <source> type syslog port 5140 bind 0.0.0.0 tag syslog.udp format /^(?<time>.*?) (?<container_id>.*?) (?<container_name>.*?): (?<message>.*?)$/ time_format %Y-%m-%dT%H:%M:%S%z </source> <match syslog.**> index_name <ES_INDEX_NAME> type_name <ES_TYPE_NAME> type elasticsearch host <ES_HOST> port <ES_PORT> flush_interval 3s </match> 

正如我在这个回答中详细讨论的那样,OP没有任何确认,我发现最好的方法是configuration容器中运行的应用程序将消息logging到syslog,并将主机的syslog套接字挂载到容器。

docker run -v /dev/log:/dev/log ...

这种方法的缺点是,如果主机上的syslog守护进程重新启动,那么容器会丢失它的套接字,因为守护进程在重新启动时重新创build套接字。

一个修复这将是添加另一个套接字(在rsyslog这可以使用imuxsock模块完成 )。 在某个已知目录中创build额外的套接字,然后直接绑定挂载目录而不是/dev/log 。 当rsyslog重新启动时,附加套接字也将被删除,但在重新启动之后,将被重新创build并可用于目录中的应用程序。

处理这个问题的一个简单方法是将主机的/sys/fs/cgroup挂载到运行in_docker_metrics的Docker容器中。 请参阅https://github.com/bdehamer/docker-librato

Sematext Docker代理(开源,github)可以为您做到这一点。 你将不需要td-agent。 SDA将收集日志,还会收集事件和指标。 请参阅https://github.com/sematext/sematext-agent-docker和https://sematext.com/docker