非root用户如何监控Docker容器日志?

6

我希望能够以非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 文件?或者有其他好的监控方式吗?
4个回答

7

Logspout 是另一种收集容器日志的方式。我不确定这是否是最佳解决方案,但它是一种非常有趣和一致的方式来收集容器的日志。

你只需要运行 logspout 容器。该容器具有一个功能,可以将 Docker 容器的日志发送到其他 syslog 服务器(或者您也可以使用 HTTP API ,请参见 存储库)。

# (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的示例。它通过syslog协议接收日志并将其发送到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>

我选择这个解决方案! - Matt - sanemat
1
这种方法有一定的风险,因为Docker存在与日志相关的内存泄漏问题(https://github.com/docker/docker/issues/9139)。当Docker 1.5.1发布时,这个问题将得到解决(https://github.com/docker/docker/pull/10347)。 - nacyot

1

1

正如我在this answer中详细讨论但OP并没有承认一样,我发现最好的方法是配置运行在容器内的应用程序将消息日志记录到系统日志,并将主机的系统日志套接字挂载到容器中。

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

这种方法的缺点是,如果主机上的系统日志守护程序重新启动,容器将失去它的套接字,因为守护进程会在重启时重新创建套接字。

解决方法是添加另一个套接字(在rsyslog中可以使用imuxsock模块实现)。在某个已知目录中创建附加套接字,然后将该目录绑定挂载而不是直接挂载/dev/log。在重新启动rsyslog时,附加套接字也将被删除,但在目录中重新创建后,将可供应用程序使用。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接