​ 随着Docker容器广泛应用,不同的容器都会产生日志。对大规模运行的容器集群来说,日志不能统一管理是很耗费精力的。大量的微服务,各个容器服务是有相互调用的,这时候发现问题时,通过日志排查问题,需要查看对应各个容器的日志。如果没有一个统一的日志管理工具,没有可视化Web查看,是很痛苦的,而且不方便快速定位问题。

​ 为了统一日志管理,现在有了Fluentd,但日志的检索,查看就依赖于其他工具了。这里我们使用Elasticsearch + Fluentd + Kibana搭建Docker日志管理系统。这3个系统又简称EFK。

Elasticsearch是一个以易用性着称的开源搜索引擎。

Fluentd是一个日志管理工具。

Kibana是一个开源的Web UI,使Elasticsearch对工程师和数据科学家都很友好。

​ 通过这3个系统,我们使用Docker compose搭建我们的日志系统。

搭建服务

准备docker-compse.yml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
version: '2'
services:
fluentd:
build: ./fluentd
volumes:
- ./fluentd/conf:/fluentd/etc
links:
- "elasticsearch"
ports:
- "24224:24224"
- "24224:24224/udp"

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

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

当前目录下fluentd/Dockerfile文件。使用Fluentd的官方Docker镜像,并另外安装Elasticsearch插件。

1
2
FROM fluent/fluentd:v1.3
RUN ["gem", "install", "fluent-plugin-elasticsearch"]

准备Fluentd的配置文件fluentd/conf/fluent.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<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>

启动容器

1
docker-compose up

可以使用docker ps命令检查容器

测试

搭建nginx服务,使用fluentd管理日志

1
2
3
4
5
6
7
8
docker run -d \
--log-driver fluentd \
--log-opt fluentd-address=localhost:24224 \
--log-opt tag="nginx-test" \
--log-opt fluentd-async-connect \
--name nginx-test \
-p 8080:80 \
nginx

访问服务curl localhost:8080

主要nginx服务必须在fluentd服务启动后再启动,否则日志不生效。

例如这种情况:

image-20191202232531931

通过Kibana查看日志

在你的浏览器中访问http://localhost:5601/,然后为Kibana设置匹配的索引名,请使用**fluentd-\***作为索引名,并点击“Create”按钮。

img

去Discover页面选项卡查看日志

image-20191202232349606

参考文章

https://github.com/kzk/docker-compose-efk

EFK(Elasticsearch + Fluentd + Kibana)方式进行Docker日志收集、检索展示