在上一篇文章《使用Docker-Compose部署单节点ELK》中讲述了如何使用Docker-Compose创建一个单节点的ELK服务;但是目前在整个ELK-Stack中还包括了Filebeat进行日志采集;
本文在上一篇文章的基础之上在服务中添加了Filebeat,形成了目前业界比较常用的完整的ELK-Stack组件栈;
源代码:
系列文章:
使用Docker-Compose部署单节点ELK-Stack
前言
本文使用ElasticSearch官方的镜像和Docker-Compose来创建单节点的ELK Stack;
在ELK Stack中同时包括了Elastic Search、LogStash、Kibana以及Filebeat;
各个组件的作用如下:
- Filebeat:采集文件等日志数据;
- LogStash:过滤日志数据;
- Elastic Search:存储、索引日志;
- Kibana:用户界面;
各个组件之间的关系如下图所示:

无Filebeat的版本:
项目说明
项目环境
各个环境版本:
- 操作系统:CentOS 7
- Docker:20.10.6
- Docker-Compose:1.29.1
- ELK Version:7.1.0
- Filebeat:7.1.0
Docker-Compose变量配置
首先,在配置文件.env中统一声明了ES以及各个组件的版本:
.env
1 | ES_VERSION=7.1.0 |
Docker-Compose服务配置
创建Docker-Compose的配置文件:
docker-compose.yml
1 | version: '3.4' |
在Services中声明了四个服务:
- elasticsearch;
- logstash;
- kibana;
- filebeat;
① ElasticSearch服务
在elasticsearch服务的配置中有几点需要特别注意:
discovery.type=single-node:将ES的集群发现模式配置为单节点模式;/etc/localtime:/etc/localtime:Docker容器中时间和宿主机同步;/docker_es/data:/usr/share/elasticsearch/data:将ES的数据映射并持久化至宿主机中;
在启动ES容器时,需要先创建好宿主机的映射目录;
并且配置映射目录所属,例如:
1 sudo chown -R 1000:1000 /docker_es/data否则可能报错!
见:
② LogStash服务
在logstash服务的配置中有几点需要特别注意:
./logstash.conf:/usr/share/logstash/pipeline/logstash.conf:将宿主机本地的logstash配置映射至logstash容器内部;
下面是LogStash的配置,在使用时可以自定义:
logstash.conf
1 | input { |
在这里我们将原来tcp收集方式修改为由filebeat上报,同时固定了索引为test;
③ Kibana服务
在kibana服务的配置中有几点需要特别注意:
ELASTICSEARCH_URL=http://elasticsearch:9200:配置ES的地址;/etc/localtime:/etc/localtime:Docker容器中时间和宿主机同步;
④ Filebeat服务
在Filebeat服务的配置中有几点需要特别注意:
- 配置
user: root和环境变量strict.perms=false:如果不配置可能会因为权限问题无法启动; volumes映射:./filebeat.yml:/usr/share/filebeat/filebeat.yml:ro:配置文件映射;/docker_es/filebeat/logs:/usr/share/filebeat/logs:rw:将日志目录映射至容器中;/docker_es/filebeat/data:/usr/share/filebeat/data:rw:将数据目录映射至容器中;
同时还需要创建Filebeat配置文件:
filebeat.yml
1 | filebeat.inputs: |
上面给出了一个filebeat配置文件示例,实际使用时可以根据需求进行修改;
使用方法
使用前必看:
① 修改ELK版本
可以修改在
.env中的ES_VERSION字段,修改你想要使用的ELK版本;② LogStash配置
修改
logstash.conf为你需要的日志配置;③ 修改ES文件映射路径
修改
docker-compose中elasticsearch服务的volumes,将宿主机路径修改为你实际的路径:
1
2
3
4 volumes:
- /etc/localtime:/etc/localtime
- - /docker_es/data:/usr/share/elasticsearch/data
+ - [your_path]:/usr/share/elasticsearch/data并且修改宿主机文件所属:
1 sudo chown -R 1000:1000 [your_path]④ 修改filebeat服务配置
修改
docker-compose中filebeat服务的volumes,将宿主机路径修改为你实际的路径:
1
2
3
4
5
6 volumes:
- ./filebeat.yml:/usr/share/filebeat/filebeat.yml:ro
- - /docker_es/filebeat/logs:/usr/share/filebeat/logs:rw
+ - <your_log_path>:/usr/share/filebeat/logs:rw
- - /docker_es/filebeat/data:/usr/share/filebeat/data:rw
+ - <your_data_path>:/usr/share/filebeat/logs:rw⑤ 修改Filebeat配置
修改
filebeat.yml为你需要的配置;
随后使用docker-compose命令启动:
1 | docker-compose up -d |
在portainer中可以看到四个容器全部被成功创建:

访问<ip>:5601/可以看到Kibana也成功启动:

同时Filebeat输出日志:
1 | docker logs -f docker_repo_filebeat_1 |
监控成功!
测试
向文件中添加内容
由于我们的映射文件被映射在/docker_es/filebeat/logs目录下,所以我们在这个目录新增日志文件:
1 | echo "hello filebeat" >> info.log |
随后查看Filebeat日志:
1 | docker logs -f docker_repo_filebeat_1 |
可以看到Filebeat成功收集到了日志!
在Kibana中查看
从上面我们可以看到Filebeat成功收集到了日志,那么有没有经过LogStash过滤并最终提交到ES中呢?
我们可以在Kibana中查看;
由于我们在LogStash中定义的Index是test,所以可以添加test索引;
在Management中点击Kibana下面的Index Management,并输入上面我们插入的索引test:

创建成功后可以在Discover中查看:

从图中可以看出,我们创建的文件的确提交到了整个ELK Stack中!
日志中显示了我们刚刚插入的hello filebeat!
至此,整个ELK Stack的功能测试完毕,尽情享用吧!
附录
源代码:
系列文章:
文章参考: