【问题标题】:How to monitor docker containers log from non-root user?如何从非 root 用户监控 docker 容器日志?
【发布时间】:2014-10-08 09:07:09
【问题描述】:

我想从非 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?或任何其他好的监控方式?

【问题讨论】:

    标签: docker fluentd


    【解决方案1】:

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

    您只需要运行logspout 容器。该容器具有将 docker 容器的日志发送到其他 syslog 服务器的功能。 (或者你也可以使用 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 示例。它从 syslog 协议接收日志并将它们发送到 elasticsearch 服务器。 (查看example project

    <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>
    

    【讨论】:

    【解决方案2】:

    正如我在this answer 中详细讨论的那样,OP 从未确认过,我发现最好的方法是配置容器内运行的应用程序以将消息记录到 syslog,并将主机的 syslog 套接字挂载到容器。

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

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

    解决此问题的方法是添加另一个套接字(在 rsyslog 中,这可以使用 imuxsock module 完成)。在某个已知目录中创建附加套接字,然后直接绑定挂载目录而不是/dev/log。当 rsyslog 重新启动时,额外的套接字也将被删除,但将重新创建并在重新启动后的目录中可供应用程序使用。

    【讨论】:

      【解决方案3】:

      解决此问题的一种简单方法是将主机的/sys/fs/cgroup 挂载到正在运行 in_docker_metrics 的 Docker 容器中。见https://github.com/bdehamer/docker-librato

      【讨论】:

        【解决方案4】:

        Sematext Docker 代理(开源,github)可以为您完成这项工作。您将不需要 td-agent。 SDA 将收集日志,但也会收集事件和指标。请参阅https://github.com/sematext/sematext-agent-dockerhttps://sematext.com/docker

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-18
          • 1970-01-01
          • 1970-01-01
          • 2020-04-14
          • 2018-07-06
          • 2018-12-14
          相关资源
          最近更新 更多