【ELK Stack 实战】Docker 一键部署 Elasticsearch+Kibana+Logstash(含 Filebeat 可选方案)
本文详细介绍了基于Docker环境的ELK Stack(Elasticsearch + Kibana+ Logstash)8.6.2部署流程,包含核心组件配置与轻量级日志采集工具Filebeat的可选集成方案。重点内容包括:Docker环境准备与网络初始化、Elasticsearch和Kibana的核心部署、Logstash管道配置详解、Filebeat采集方案实现,以及Java应用日志采集扩展方
本文基于 Docker 环境,详细讲解 ELK Stack(Elasticsearch 8.6.2 + Kibana 8.6.2 + Logstash 8.6.2)的部署流程,同时提供轻量级日志采集工具 Filebeat 的可选集成方案,帮助开发者快速搭建企业级日志管理平台。
一、ELK 核心组件与工作流解析
1.1 组件功能拆解
| 组件 | 核心角色 | 可选性 |
|---|---|---|
| Elasticsearch | 分布式搜索与存储引擎,负责日志的持久化、检索与聚合分析 | 必选 |
| Kibana | 可视化前端,提供日志查询、仪表盘、告警等交互能力 | 必选 |
| Logstash | 数据处理管道,支持日志的解析、过滤、 enrichment(如字段提取、数据清洗) | 可选 |
| Filebeat | 轻量级日志采集器,部署在日志源服务器,低消耗采集日志并推送至 Logstash/ES | 可选 |
1.2 日志流全链路
- 完整链路(含 Logstash+Filebeat):
业务服务器日志 → Filebeat 采集 → Logstash 处理 → Elasticsearch 存储 → Kibana 可视化 - 简化链路(无 Logstash):
业务服务器日志 → Filebeat 直连 ES → Kibana 可视化
二、环境准备:Docker 与网络初始化
2.1 安装 Docker(CentOS 示例)
# 下载阿里云 Docker CE 仓库配置文件
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
# 3. 安装 Docker CE
yum install docker-ce -y
# 4. 启动并设置开机自启
systemctl start docker
systemctl enable docker
2.2 验证 Docker 环境
# 查看 Docker 系统信息(版本、存储驱动等),确认启动正常
docker info
2.3 创建 ELK 专用 Docker 网络
docker network create elk
三、核心组件部署:Elasticsearch
3.1 拉取 ES 镜像并启动容
docker run -d \
--name=elasticsearch \
-v es-data:/usr/share/elasticsearch/data \
-e ES_JAVA_OPTS="-Xms256m -Xmx512m" \
-e "discovery.type=single-node" \
-e "xpack.security.enabled=false" \
--net elk \
-p 9200:9200 -p 9300:9300 \
docker.elastic.co/elasticsearch/elasticsearch:8.6.2
- 参数说明:
es-data数据卷:持久化 ES 数据,删除容器不丢失日志;ES_JAVA_OPTS:JVM 内存配置,根据服务器内存调整(建议至少 2GB 内存服务器设置-Xms1g -Xmx2g);xpack.security.enabled=false:关闭安全认证(生产环境需开启并配置密码)。
3.2 验证 ES 服务
重启 Elasticsearch 容器使配置生效
docker restart elasticsearch
# 访问 ES 接口,返回 JSON 即正常(替换“宿主机IP”为实际地址)
curl http://宿主机ip:9200
四、核心组件部署:Kibana(ES 可视化界面)
4.1拉取 Kibana 镜像并启动容器
docker run -d \
--name=kibana \
-e ELASTICSEARCH_HOSTS=http://elasticsearch:9200 \
-e I18N_LOCALE=zh-CN \
--net elk \
-p 5601:5601 \
docker.elastic.co/kibana/kibana:8.6.2
- 访问验证:浏览器打开
http://宿主机ip:5601,首次加载需等待 1-2 分钟初始化完成后,即可看到中文界面(因 ES 关闭认证,无需登录)。
五、可选组件:Logstash 部署与配置
5.1 编写 Logstash 管道配置
# 创建 Logstash 配置目录
sudo mkdir -p /etc/logstash/conf.d
# 编辑 Logstash 管道配置
sudo vi /etc/logstash/conf.d/my-pipeline.conf
输入以下内容(定义日志的输入、过滤、输出规则):
# 1. 输入:监听 TCP 5044 端口,接收 JSON 格式日志
input {
tcp {
port => 5044
# 输入为json线数据
codec => json_lines
}
}
# 2. 过滤:调整时间戳为北京时间(UTC+8)
filter {
ruby {
code => "event.set('timestamp', event.get('@timestamp').time.localtime + 8*60*60)"
}
ruby {
code => "event.set('@timestamp',event.get('timestamp'))"
}
mutate {
remove_field => ["timestamp"]
}
}
# 3. 输出:1. 控制台打印(调试用);2. 发送至 ES
output {
stdout { codec => rubydebug } # 调试用,生产可注释
elasticsearch {
hosts => ["http://宿主机IP:9200"]
index => "logstash-%{[server_name]}-%{+yyyy.MM.dd}"
}
}
5.2 启动 Logstash 容器
docker run -d --name logstash --restart=always \
-p 5044:5044 \
-v /etc/logstash/conf.d/my-pipeline.conf:/usr/share/logstash/pipeline/logstash.conf \
--net elk \
docker.elastic.co/logstash/logstash:8.6.2
- 验证:执行
docker logs -f logstash,看到Pipeline main started即表示启动成功。
六、可选组件:Filebeat 部署与配置(轻量级日志采集)
6.1 编写 Filebeat 配置文件
# 修正原命令“mkdir”路径错误(原“filebeat.yml”是文件,需先建目录)
sudo mkdir -p /usr/local/filebeat
# 编辑 Filebeat 配置文件
sudo vi /usr/local/filebeat/filebeat.yml
输入以下内容(采集系统日志并推送至 Logstash):
# 日志输入源配置
filebeat.inputs:
- type: log # 输入类型:日志文件
enabled: true # 启用该输入配置
paths: # 待采集的日志路径(系统日志)
- /var/log/*.log # 采集 /var/log 下所有 .log 结尾的文件
- /var/log/messages # 采集系统核心日志
# 禁用索引生命周期管理(ILM),使用自定义索引
# setup.ilm.enabled: false
# 新增 processors 配置,添加 server_name 字段
processors:
- add_fields:
fields:
server_name: "filebeat" # 替换为实际服务器标识,如web-server-01
target: "" # 直接添加到顶层字段
# 输出配置发送到 Logstash
output.logstash:
hosts: ["logstash-host:5044"] # Logstash 的地址和端口
codec: json_lines
# ========== 可选:索引模板(若直接输出到 Elasticsearch) ==========
# setup.template.name: "java-app"
# setup.template.pattern: "java-app-*"
# output.elasticsearch:
# hosts: ["http://es-host:9200"]
# index: "java-app-%{+yyyy.MM.dd}"
6.2 启动 Filebeat 容器
docker run -d --name filebeat --restart=always \
-v /usr/local/filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml \ # 挂载配置文件
-v /var/log:/var/log \ # 挂载宿主机日志目录(只读)
--user root \ # 以 root 权限运行(确保日志读取权限)
-p 5045:5044 \ # 宿主机端口改为5045,容器内仍为5044
--net elk \ # 加入 ELK 专用网络
docker.elastic.co/beats/filebeat:8.6.2
- 验证:执行
docker logs -f filebeat,无 ERROR 日志即表示采集正常。
七、全链路测试:从日志采集到可视化
7.1 生成测试日志
在宿主机执行命令,触发 Filebeat 采集:
echo "ELK 测试日志:$(date +'%Y-%m-%d %H:%M:%S')" >> /var/log/test.log
7.2 在 Kibana 查看日志
-
创建数据视图:
- 进入 Kibana → 「管理」→「数据视图」→「创建数据视图」;
- 索引模式输入
logstash-*,时间字段选择@timestamp,点击「创建」。
-
查询日志:
- 进入「Discover」,时间范围选择「今天」,即可看到测试日志及系统日志。
八、Java 应用日志采集扩展(可选)
若需采集 Java 应用日志(如 Spring Boot),可通过以下步骤配置:
8.1 配置 Logback 输出 JSON 日志
在 Java 项目的 pom.xml 中引入依赖:
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>6.3</version>
</dependency>
(因为我在logstash配置中使用到的功能需要老版本的依赖支持,所以是6.3)
在项目的resources下添加logstash配置logback-spring.xml文件(可以自己定义):
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level)] %cyan(%logger{50}.%M.%L) - %highlight(%msg) %n
</Pattern>
</layout>
</appender>
<!--logback输出 -->
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>101.126.94.192:5044</destination>
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<!-- 打印行号、方法名,默认为false -->
<includeCallerData>true</includeCallerData>
<!-- 设置时区-->
<timeZone>UTC</timeZone>
<!--日期格式化-->
<!-- <timestampPattern>yyyy-MM-dd HH:mm:ss.SSS</timestampPattern>-->
<!--添加自定义属性,server_name是服务器的名称-->
<customFields>{"server_name":"user-server"}</customFields>
</encoder>
<!-- 设置超时时间,默认没有,使用集群的时候可以加上-->
<!-- <writeTimeout>30 seconds</writeTimeout>-->
</appender>
<root level="info">
<!--本地开发调试将控制台输出打开,同时日志文件输出挂壁,提高日志性能:线上部署请务必将控制台输出关闭 -->
<appender-ref ref="STDOUT"/>
<appender-ref ref="LOGSTASH"/>
</root>
</configuration>
8.2 验证 Java 日志
启动 Java 应用后,在 Kibana 中可看到索引 logstash-user-server-yyyy.MM.dd 的应用日志。
九、生产环境优化建议
- ES 高可用:生产环境需部署 ES 集群(至少 3 节点),通过
discovery.seed_hosts配置节点发现; - 安全加固:开启 ES 安全认证(
xpack.security.enabled=true),配置复杂密码并定期轮换; - 资源隔离:为每个 ELK 组件分配独立的 Docker 资源限制(如
--memory 4g); - 日志清理:配置 ES 索引生命周期策略(ILM),自动清理过期日志,避免磁盘占满。
本文详细覆盖了 ELK Stack 的 Docker 部署全流程,从核心组件到可选工具 Filebeat 的集成,帮助开发者快速落地日志管理方案。若有疑问,欢迎在评论区交流~
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)