ElasticSearch ELKB 日志分析 介绍
docker-compose一键部署ELK(elasticsearch+logstash+kibana)
以下是使用 Docker Compose 部署 Elasticsearch、Logstash、Kibana 和 Beats(以 Filebeat 为例) 的完整方案,涵盖配置文件、关键参数说明及部署步骤,适用于日志采集、存储与分析场景:
一、核心组件与架构
- Elasticsearch:日志存储与搜索引擎,支持分布式扩展。
- Logstash:日志采集、解析与转发工具,支持多数据源输入。
- Kibana:数据可视化与仪表板工具,与 Elasticsearch 集成。
- Filebeat:轻量级日志采集器,用于从文件或系统日志中收集数据并发送至 Logstash/Elasticsearch。
架构流程 :
Filebeat → Logstash → Elasticsearch → Kibana
二、Docker Compose 配置文件
创建 docker-compose.yml
文件,内容如下:
yaml
version: '3.8'
services:
# Elasticsearch 服务
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.15.0
container_name: elasticsearch
environment:
- discovery.type=single-node # 单节点模式(生产环境需改为集群配置)
- ES_JAVA_OPTS=-Xms1g -Xmx1g # JVM 堆内存设置(根据主机内存调整)
- xpack.security.enabled=false # 禁用安全认证(生产环境需开启)
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- es_data:/usr/share/elasticsearch/data # 数据持久化
ports:
- "9200:9200" # REST API 端口
- "9300:9300" # 节点间通信端口
networks:
- elk_network
# Logstash 服务
logstash:
image: docker.elastic.co/logstash/logstash:8.15.0
container_name: logstash
volumes:
- ./logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml # Logstash 配置文件
- ./logstash/pipeline:/usr/share/logstash/pipeline # 管道配置目录
depends_on:
- elasticsearch
ports:
- "5044:5044" # Beats 输入端口
- "9600:9600" # 监控端口
networks:
- elk_network
# Kibana 服务
kibana:
image: docker.elastic.co/kibana/kibana:8.15.0
container_name: kibana
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200 # 指定 Elasticsearch 地址
depends_on:
- elasticsearch
ports:
- "5601:5601" # Kibana 访问端口
networks:
- elk_network
# Filebeat 服务
filebeat:
image: docker.elastic.co/beats/filebeat:8.15.0
container_name: filebeat
user: root # 需要 root 权限访问主机日志文件
volumes:
- ./filebeat/config/filebeat.yml:/usr/share/filebeat/filebeat.yml # Filebeat 配置文件
- /var/log:/var/log:ro # 挂载主机日志目录(只读)
depends_on:
- logstash
networks:
- elk_network
volumes:
es_data: # Elasticsearch 数据卷
networks:
elk_network: # 自定义网络,确保容器间通信
driver: bridge
三、关键配置文件说明
1. Logstash 管道配置 (logstash/pipeline/logstash.conf
)
conf
input {
beats {
port => 5044 # 监听 Filebeat 发送的数据
}
}
filter {
# 示例:解析 JSON 格式日志
if [message] =~ "^{" {
json {
source => "message"
}
}
}
output {
elasticsearch {
hosts => ["elasticsearch:9200"] # 输出到 Elasticsearch
index => "logstash-%{+YYYY.MM.dd}" # 按日期生成索引
}
stdout { codec => rubydebug } # 调试用,输出到控制台
}
2. Filebeat 配置 (filebeat/config/filebeat.yml
)
yaml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/*.log # 采集主机日志目录下的所有 .log 文件
fields:
app: "my_application" # 自定义字段,用于标识日志来源
output.logstash:
hosts: ["logstash:5044"] # 发送到 Logstash
四、部署步骤
-
创建目录结构:
bashmkdir -p elk/{logstash/config,logstash/pipeline,filebeat/config} chmod -R 777 elk # 确保容器有权限访问目录
-
放置配置文件:
- 将上述
logstash.conf
和filebeat.yml
分别放入对应目录。
- 将上述
-
启动服务:
bashdocker-compose up -d
-
验证部署:
- Elasticsearch :访问
http://localhost:9200
,返回 JSON 信息表示成功。 - Kibana :访问
http://localhost:5601
,登录后创建索引模式(如logstash-*
)查看日志。 - Logstash :检查日志输出(
docker logs logstash
)确认数据接收。 - Filebeat :检查日志输出(
docker logs filebeat
)确认日志采集。
- Elasticsearch :访问
五、生产环境优化建议
-
集群配置:
- Elasticsearch 改为多节点部署,修改
discovery.type
和cluster.initial_master_nodes
。 - 增加
vm.max_map_count
系统参数(通过sysctl -w vm.max_map_count=262144
)。
- Elasticsearch 改为多节点部署,修改
-
安全认证:
- 启用 Elasticsearch 的 X-Pack 安全功能,生成证书并配置 Kibana/Logstash 使用 HTTPS。
-
资源限制:
- 为每个容器设置 CPU/内存限制(如
resources.limits.memory: 2G
)。
- 为每个容器设置 CPU/内存限制(如
-
日志轮转:
- 配置 Filebeat 的
close_inactive
和clean_inactive
参数避免日志文件过多。
- 配置 Filebeat 的
六、常见问题排查
- 容器无法通信 :检查是否加入同一自定义网络(
elk_network
)。 - Elasticsearch 启动失败 :检查
vm.max_map_count
和memlock
配置。 - Logstash 无数据输入 :确认 Filebeat 的
output.logstash.hosts
地址正确。 - Kibana 无法连接 Elasticsearch :检查
ELASTICSEARCH_HOSTS
环境变量是否指向正确的容器名称。