使用Docker快速搭建ELK日志分析平台
前言
ELK 是 Elasticsearch、Logstash、Kibana 三大开源工具的首字母缩写,广泛应用于日志收集、搜索和分析场景。本文将带你使用 Docker 快速搭建一套 ELK 环境,适合开发测试和小规模生产使用。
环境准备
-
操作系统:Linux
-
Docker 版本:20.10+
-
Docker Compose 版本:2.0+
-
内存建议:至少 4GB(ES 比较吃内存)
快速开始
1. 安装docker
2.创建项目目录
mkdir elk-docker && cd elk-docker
vim docker-compose.yml
3. 编写 docker-compose.yml
version: '3.8'
services:
# ==================== Elasticsearch ====================
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0
container_name: elk-elasticsearch
restart: unless-stopped
environment:
# 单节点模式
- discovery.type=single-node
# 关闭安全认证(简化部署,生产环境建议开启)
- xpack.security.enabled=false
# 关闭监控功能(节省资源)
- xpack.monitoring.collection.enabled=false
# JVM 堆内存大小(根据你的机器内存调整)
- ES_JAVA_OPTS=-Xms512m -Xmx512m
ports:
# HTTP API 端口
- "9200:9200"
# 集群内部通信端口(不需要暴露到宿主机也可以)
- "9300:9300"
volumes:
# 数据持久化(防止容器删除后数据丢失)
- es-data:/usr/share/elasticsearch/data
# 可选:挂载配置文件
# - ./elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro
networks:
- elk-network
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9200"]
interval: 30s
timeout: 10s
retries: 5
# ==================== Logstash ====================
logstash:
image: docker.elastic.co/logstash/logstash:8.11.0
container_name: elk-logstash
restart: unless-stopped
ports:
# Beats 协议端口(Filebeat 使用)
- "5044:5044"
# TCP 端口(通过 TCP 发送日志,如 Java 应用)
- "5000:5000"
# UDP 端口
- "5000:5000/udp"
volumes:
# 挂载 Logstash 管道配置文件
- ./logstash/pipeline/:/usr/share/logstash/pipeline/:ro
- /home/hermes/.hermes/sessions:/data/hermes-logs:ro
- ./logstash/data:/usr/share/logstash/data
# 可选:挂载 Logstash 配置文件
# - ./logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml:ro
environment:
# JVM 堆内存设置
- LS_JAVA_OPTS=-Xms256m -Xmx256m
depends_on:
elasticsearch:
condition: service_healthy
networks:
- elk-network
# ==================== Kibana ====================
kibana:
image: docker.elastic.co/kibana/kibana:8.11.0
container_name: elk-kibana
restart: unless-stopped
ports:
- "5601:5601"
environment:
# 连接 Elasticsearch 的地址(注意:使用服务名而不是 localhost)
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
# 设置中文界面
- I18N_LOCALE=zh-CN
# Kibana 服务器配置
- SERVER_NAME=kibana
- SERVER_HOST=0.0.0.0
depends_on:
elasticsearch:
condition: service_healthy
networks:
- elk-network
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:5601/api/status"]
interval: 30s
timeout: 10s
retries: 5
# ==================== 数据卷定义 ====================
volumes:
es-data:
driver: local
# ==================== 网络定义 ====================
networks:
elk-network:
driver: bridge
4. 配置 Logstash 管道
创建 Logstash 配置文件目录和管道文件:
mkdir -p logstash/pipeline
vim logstash/pipeline/logstash.conf
创建 logstash/pipeline/logstash.conf:
input { # 从 TCP 端口接收日志(可用于 Filebeat 等) tcp { port => 5000 codec => json_lines } # 从标准输入接收(用于测试) stdin { } } filter { # 如果有必要,可以在这里添加过滤规则 # 例如:解析 Nginx 日志、提取字段等 grok { match => { "message" => "%{COMBINEDAPACHELOG}" } } date { match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ] } } output { elasticsearch { hosts => ["elasticsearch:9200"] index => "logstash-%{+YYYY.MM.dd}" } stdout { codec => rubydebug }} }
4. 启动服务
docker compose up -d
查看启动状态:
docker compose ps
查看日志:
docker-compose logs -f
5. 验证服务
-
Elasticsearch:访问 http://弹性IP:9200
-
Kibana:访问 http://弹性IP:5601
-
Logstash:TCP 端口 5000 已开放
注:需要开通9200、5601的端口
测试日志收集
方法一:使用 netcat 发送日志
echo '{"message":"Hello ELK", "level":"info"}' | nc localhost 5000
方法二:使用 Logstash 的 stdin 输入
进入 Logstash 容器:
docker exec -it elk-logstash bash
然后在容器内输入任意字符,观察日志是否被解析并输出到 Elasticsearch。
Kibana 基础配置
-
打开浏览器访问
http://localhost:5601 -
左侧菜单进入 Management → Stack Management → Kibana → Index Patterns
-
点击 Create index pattern
-
输入
logstash-*,点击 Next step -
选择
@timestamp作为时间字段,点击 Create index pattern -
进入 Discover 页面,即可查看收集到的日志
常用命令
# 停止服务 docker compose down # 停止并删除数据卷(清空所有数据) docker compose down -v # 重启单个服务 docker compose restart elk-elasticsearch # 查看容器资源占用 docker stats # 进入容器调试 docker exec -it elk-elasticsearch bash
常见问题
1. Elasticsearch 启动失败(vm.max_map_count 过小)
解决方案:
# 宿主机执行 sudo sysctl -w vm.max_map_count=262144 # 永久修改 echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf
2. Kibana 无法连接 Elasticsearch
检查 Kibana 环境变量中的 ELASTICSEARCH_HOSTS 是否正确,确认 ES 已经启动完成(可能需要等待 30 秒)。
3. 端口冲突
修改 docker-compose.yml 中映射的主机端口,例如 "5602:5601"。
4. 日志量太大导致磁盘不足
定期清理索引或缩短索引保留时间。可通过 Kibana 的 ILM(索引生命周期管理)配置自动删除。
生产环境注意事项
-
开启安全认证:启用 Elasticsearch 的 xpack.security
-
数据持久化:已通过 volume 实现
-
资源限制:合理设置 JVM 堆内存(
ES_JAVA_OPTS) -
集群部署:单节点仅适合测试,生产请使用多节点集群
-
日志采集:使用 Filebeat 替代直接发送到 Logstash
总结
通过 Docker 我们可以快速搭建一套可用的 ELK 日志平台,整个过程只需要几分钟。虽然这个配置适合开发和测试环境,但它已经包含了 ELK 的核心功能。希望本文能帮助你快速入门 ELK 技术栈!
- 点赞
- 收藏
- 关注作者
评论(0)