场景

随着容器的大量使用,现在docker已经在很多生产环境得到实践,不过,容器的日志,状态,确是一个大问题,我们知道,一般可以使用命令docker logs 来查看一个特定的容器,那如果想要收集当前机器所有容器的日志呢?难不成还要将所有应用都标准化一个日志组件出来,然后将日志挂载到特定目录,然后使用logstash 去收集?当然,这种方式不算特别的方便,那有没有相对方便的方式呢?当然是有的

ELK

  • Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
  • Logstash是一个完全开源的工具,他可以对你的日志进行收集、过滤,并将其存储供以后使用(如,搜索。
  • Kibana 也是一个开源和免费的工具,它Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志
    上一周原理图大家更清晰一点

三个组件的功能简单来说是收集,整理,展示,其中,Elasticsearch在搜索领域相当的火,在做全文检索方面有相当好的应用,大家有兴趣的可以自己深入研究

使用

在使用前请确保安装好了docker,docker-compose,关于怎么安装,前面的文章也有讲过,如果不会,自己搜索解决,现在我们直接上docker-compose.yml文件

    logspout:
      image: gliderlabs/logspout:v3
      command: 'syslog://logstash:5000'
      links:
        - logstash
      volumes:
        - '/var/run/docker.sock:/tmp/docker.sock'
    
    logstash:
      image: ludekvesely/logstash-json
      environment:
        - LOGSPOUT=ignore
        - DROP_NON_JSON=false
        - STDOUT=true
      ports:
        - "5000:5000"
      links:
        - elasticsearch
    
    kibana:
      image: kibana
      environment:
        - LOGSPOUT=ignore
      links:
        - elasticsearch
      ports:
        - '5601:5601'
    
    elasticsearch:
      image: elasticsearch
      environment:
        - LOGSPOUT=ignore

在docker-compose.yml所在的目录下,使用命令sudo docker-compose up -d,然后我们用浏览器打开http://127.0.0.1:5601/,就可以看到如下的界面

如图所示,等1,2都能正常使用的时候,选择create ,这样就会创建索引,我们选中Discover页面,就会看到日志的情况

补充

有人要问了,你这只是收集本机的docker日志,如果想要将A机器的运行日志收到到B机器呢?
假定B机IP为10.10.2.52, 机器 A的docker-compose.yml如下

  image: gliderlabs/logspout:v3
  command: 'syslog+tcp://10.10.2.52:5000'
  #links:
  #  - logstash
  volumes:
    - '/var/run/docker.sock:/tmp/docker.sock'

这里使用tcp协议,将内容指向到B机的logstash暴露的端口,这样就可以正常的收集了

参考:https://github.com/ludekvesely/docker-logspout-elk