前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Docker通过EFK(Elasticsearch + Fluentd + Kibana)查询日志

Docker通过EFK(Elasticsearch + Fluentd + Kibana)查询日志

作者头像
小歪
发布2019-05-07 14:56:17
1.3K0
发布2019-05-07 14:56:17
举报

这篇文章主要是参考Docker Logging via EFK (Elasticsearch + Fluentd + Kibana) Stack with Docker Compose,并在其基础上做了一些修改。

Elasticsearch是一个开源搜索引擎,以易用性着称。kibana是一个图形界面,可以在上面条件检索存储在ElasticSearch里数据,相当于提供了ES的可视化操作管理器。截图如下:

这里基本的架构是这样的

这里主要解决的问题是日志查询,日志来源是docker。我们使用docker部署任务时,可以使用docker logs -f <容器id>查看日志,也可以去/var/lib/docker/containers/<容器id>/<容器id>-json.log查看日志文件。但是这都很难去做查询,本文介绍的EFK就可以解决这个问题。

我们会创建四个容器:

  • httpd (发送日志给EFK)
  • Fluentd
  • Elasticsearch
  • Kibana

环境准备

请安装最新的docker及docker-compose,老版本会有些问题。这里是我的版本

代码语言:javascript
复制
➜  docker version
Client: Docker Engine - Community
 Version:           18.09.2
 API version:       1.39
 Go version:        go1.10.8
 Git commit:        6247962
 Built:             Sun Feb 10 04:12:39 2019
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.2
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.6
  Git commit:       6247962
  Built:            Sun Feb 10 04:13:06 2019
  OS/Arch:          linux/amd64
  Experimental:     false
➜  docker-compose version
docker-compose version 1.23.2, build 1110ad01
docker-py version: 3.6.0
CPython version: 3.6.6
OpenSSL version: OpenSSL 1.1.0h  27 Mar 2018

编写docker-compose.yml

Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。

代码语言:javascript
复制
version: '2'
services:
  web:
    image: httpd
    ports:
      - "1080:80" #避免和默认的80端口冲突
    links:
      - fluentd
    logging:
      driver: "fluentd"
      options:
        fluentd-address: localhost:24224
        tag: httpd.access

  fluentd:
    build: ./fluentd
    volumes:
      - ./fluentd/conf:/fluentd/etc
    links:
      - "elasticsearch"
    ports:
      - "24224:24224"
      - "24224:24224/udp"

  elasticsearch:
    image: elasticsearch:5.3.0
    expose:
      - 9200
    ports:
      - "9200:9200"

  kibana:
    image: kibana:5.3.0
    links:
      - "elasticsearch"
    ports:
      - "5601:5601"

所有web里的日志会自动发送到fluentd-address: localhost:24224,也就是fluentd容器。

Elasticsearch 和 Kibana并不支持最新的版本,这里选择的是5.3.0,如果想要选择更新的,可以去这里查看

  • Elasticsearch image tags in DockerHub
  • Kibana image tags in DockerHub

Fluentd的配置和插件

新建文件fluentd/Dockerfile,使用官方镜像Fluentd’s official Docker image,安装需要的插件

代码语言:javascript
复制
# fluentd/Dockerfile
FROM fluent/fluentd:v0.12-debian
RUN ["gem", "install", "fluent-plugin-elasticsearch", "--no-rdoc", "--no-ri", "--version", "1.9.7"]

然后新建文件fluentd/conf/fluent.conf,编写Fluentd的配置文件

代码语言:javascript
复制
# fluentd/conf/fluent.conf
<source>
  @type forward
  port 24224
  bind 0.0.0.0
</source>
<match *.**>
  @type copy
  <store>
    @type elasticsearch
    host elasticsearch
    port 9200
    logstash_format true
    logstash_prefix fluentd
    logstash_dateformat %Y%m%d
    include_tag_key true
    type_name access_log
    tag_key @log_name
    flush_interval 1s
  </store>
  <store>
    @type stdout
  </store>
</match>

官方设置文档config-file

启动容器

在后台启动,使用docker-compose up -d

代码语言:javascript
复制
➜ docker-compose up -d
Recreating temp_elasticsearch_1 ... done
Recreating temp_kibana_1        ... done
Recreating temp_fluentd_1       ... done
Recreating temp_web_1           ... done

查看所有容器

代码语言:javascript
复制
➜ docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED              STATUS              PORTS                                                          NAMES
03d589afc2fd        httpd                 "httpd-foreground"       About a minute ago   Up About a minute   0.0.0.0:1080->80/tcp                                           temp_web_1
e84d0753ee58        kibana:5.3.0          "/docker-entrypoint.…"   About a minute ago   Up About a minute   0.0.0.0:5601->5601/tcp                                         temp_kibana_1
0f069b8b138f        temp_fluentd          "tini -- /bin/entryp…"   About a minute ago   Up About a minute   5140/tcp, 0.0.0.0:24224->24224/tcp, 0.0.0.0:24224->24224/udp   temp_fluentd_1
fb4c6255e7ed        elasticsearch:5.3.0   "/docker-entrypoint.…"   2 minutes ago        Up About a minute   0.0.0.0:9200->9200/tcp, 9300/tcp                               temp_elasticsearch_1

产生日志

原文是repeat 10 curl http://localhost:80/,但是我在docker-compose.yml中修改了端口,所以我这里是

代码语言:javascript
复制
➜  repeat 10 curl http://localhost:1080/
<html><body><h1>It works!</h1></body></html>
<html><body><h1>It works!</h1></body></html>
<html><body><h1>It works!</h1></body></html>
<html><body><h1>It works!</h1></body></html>
<html><body><h1>It works!</h1></body></html>
<html><body><h1>It works!</h1></body></html>
<html><body><h1>It works!</h1></body></html>
<html><body><h1>It works!</h1></body></html>
<html><body><h1>It works!</h1></body></html>
<html><body><h1>It works!</h1></body></html>

查看日志

打开http://localhost:5601,提示需要先建索引,输入fluentd-*刷新即可

Discover页面,然后就可以看到之前的日志了。

如何接入其他docker日志

这里是以docker-compose形式启动的一个服务,如果还有别的任务需要将日志发送到fluentd,需要这几个步骤。

默认情况下,docker-compose会为我们的应用创建一个网络,服务的每个容器都会加入该网络中。这样,容器就可被该网络中的其他容器访问,不仅如此,该容器还能以服务名称作为hostname被其他容器访问。

所以我们首先需要找到我们现在创建的EFK的网络名,

代码语言:javascript
复制
➜  docker network ls
NETWORK ID          NAME                         DRIVER              SCOPE
fd428cfa7264        bridge                       bridge              local
e08505f7bfe6        docker-compose-efk_default   bridge              local
650f2f690175        docker-efk_default           bridge              local
35f17aeb61e9        docker-elk_elk               bridge              local
db29d28aa5cc        esnet                        bridge              local
56ea915974c9        host                         host                local
4d0207065fb8        none                         null                local
3dd60d8ddfce        temp_default                 bridge              local
cf1a06702ae8        web_default                  bridge              local

我是在temp目录下创建的docker-compose.yml文件,所以这里默认的名字就是temp_default

再看看之前web的设置

代码语言:javascript
复制
web:
    image: httpd
    ports:
      - "1080:80" #避免和默认的80端口冲突
    links:
      - fluentd
    logging:
      driver: "fluentd"
      options:
        fluentd-address: localhost:24224
        tag: httpd.access

有几个关键设置是:links和logging,link 用于容器直接的互通,logging则是日志的输出设置。

那我们这里再启动一个新docker需要这些设置

代码语言:javascript
复制
docker run
    --link temp_fluentd_1 \
    --net temp_default  \
    --log-driver=fluentd \
    --log-opt fluentd-address=localhost:24224 \
    --log-opt tag=httpd.access \
    -d hello-world

我们去kibana看看,果然,日志已经发送到kibana了

将log添加到选择字段,日志阅读起来更佳

版本选择

上面说到这里选择的是5.3.0,我们试试新版本6.7.1,再看看kibana。使用docker-compose stop停止服务,修改docker-compose文件再启动。

但是已启动es就挂了,最

后查看日志docker-compose logs | grep elasticsearch_1,发现如下错误:

"Native controller process has stopped - no new native processes can be started"

最后在giuhub上找到答案:es crashes with "Native controller process has stopped - no new native processes can be started"

解决方法是,提高docker可用内存,mac上是这样设置,把内存从2G提高到4G,再启动就成功了。

这里是6.7.1的界面

最后想要做的就是如何在一台服务器上搜集所有的日志,理论上来说,只需要一台服务器部署上EFK,暴露端口,其他服务器去发送即可,实际上还没试过。

如果有好的意见,欢迎来提。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-04-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python爬虫与算法进阶 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 环境准备
  • 编写docker-compose.yml
  • Fluentd的配置和插件
  • 启动容器
  • 产生日志
  • 查看日志
  • 如何接入其他docker日志
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档