第一步:环境准备
请确保您的机器上已经安装了 Docker 和 Docker Compose。
第二步:创建项目目录和配置文件
为了让 Docker Compose 能够正确地构建和管理容器,我们需要创建一个特定的目录结构。
创建一个主目录,例如 elk-stack。
在 elk-stack 内部,创建 docker-compose.yml 文件。
在 elk-stack 内部,创建一个 logstash 目录,并在其中再创建一个 pipeline 目录。
在 logstash/pipeline 目录中,创建 logstash.conf 文件。
最终的目录结构如下:
elk-stack/
├── docker-compose.yml
└── logstash/
└── pipeline/
└── logstash.conf
第三步:编写配置文件
现在,我们将填充这些文件的内容。
- docker-compose.yml
这是最核心的编排文件。它定义了 ELK 的三个服务,并将它们连接在一起。请将以下内容复制到 elk-stack/docker-compose.yml 文件中。
重要提示:Elasticsearch, Kibana, 和 Logstash 的版本号必须完全一致,否则可能会出现兼容性问题。这里我们使用 8.14.0 版本。
version: '3.8'
services:
elasticsearch:
image: elasticsearch:8.14.0
container_name: elasticsearch
environment:
- discovery.type=single-node
- xpack.security.enabled=false # 为方便测试,禁用安全功能。生产环境强烈建议开启!
- ES_JAVA_OPTS=-Xms1g -Xmx1g # 根据您的机器内存调整,建议至少1GB
volumes:
- es-data:/usr/share/elasticsearch/data
ports:
- "9200:9200"
- "9300:9300"
networks:
- elk-net
kibana:
image: kibana:8.14.0
container_name: kibana
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200 # 指向 Elasticsearch 容器
ports:
- "5601:5601"
depends_on:
- elasticsearch
networks:
- elk-net
logstash:
image: logstash:8.14.0
container_name: logstash
volumes:
- ./logstash/pipeline:/usr/share/logstash/pipeline:ro # 挂载 Logstash 管道配置
ports:
- "5000:5000/tcp" # 为数据输入开放 TCP 端口
- "5000:5000/udp"
depends_on:
- elasticsearch
networks:
- elk-net
volumes:
es-data:
driver: local
networks:
elk-net:
driver: bridge
配置说明:
discovery.type=single-node: 告知 Elasticsearch 这是一个单节点实例,无需进行集群发现。
xpack.security.enabled=false: 为了简化初次设置,我们禁用了 Elasticsearch 的安全特性(如用户名密码认证)。在生产环境中,请务必将其设置为 true 并配置好密码。
volumes: 我们为 Elasticsearch 的数据创建了一个名为 es-data 的持久化数据卷,这样即使容器被删除,数据也不会丢失。同时,我们将本地的 Logstash 配置文件挂载到了 Logstash 容器中。
networks: 我们创建了一个名为 elk-net 的桥接网络,让三个容器可以通过服务名(elasticsearch, kibana, logstash)相互通信。
depends_on: 确保 Elasticsearch 容器启动后,Kibana 和 Logstash 才会启动。
2. logstash/pipeline/logstash.conf
这个文件定义了 Logstash 的数据处理管道:从哪里接收数据(input),如何处理数据(filter),以及将数据发送到哪里(output)。
将以下内容复制到 elk-stack/logstash/pipeline/logstash.conf 文件中。
input {
# 通过 TCP 协议监听 5000 端口,接收 JSON 格式的日志
tcp {
port => 5000
codec => json_lines
}
}
filter {
# 此处可以添加过滤规则,例如 grok, mutate 等
# 暂时留空作为示例
}
output {
# 将处理后的数据输出到 Elasticsearch
elasticsearch {
hosts => ["http://elasticsearch:9200"]
index => "logstash-%{+YYYY.MM.dd}" # 索引名称格式
}
# 同时在 Logstash 容器的控制台打印输出,方便调试
stdout {
codec => rubydebug
}
}
这个配置表示 Logstash 会:
Input: 监听 TCP 端口 5000,并期望接收到的每行都是一个独立的 JSON 对象。
Output: 将数据发送到名为 elasticsearch 的主机的 9200 端口,并根据日期创建索引(例如 logstash-2025.06.26)。
第四步:启动和验证 ELK Stack
万事俱备,现在可以启动整个技术栈了。
启动服务
在 elk-stack 目录下,打开终端并运行以下命令:
docker-compose up -d (有的版本是docker cpmpose)
这个命令会在后台(-d)拉取镜像并启动所有服务。第一次启动可能需要一些时间来下载镜像。
检查容器状态
等待一两分钟后,运行以下命令检查所有容器是否都已正常运行:
docker-compose ps
应该能看到 elasticsearch, kibana, 和 logstash 三个容器的状态都是 Up 或 running。
验证服务
Elasticsearch: 在浏览器或使用 curl 访问 http://localhost:9200。如果看到一个包含版本信息的 JSON 响应,说明 Elasticsearch 已成功运行。
Kibana: 在浏览器中访问 http://localhost:5601。应该能看到 Kibana 的欢迎界面。由于启动需要时间,如果无法访问请稍等片刻再刷新。
第五步:发送并查看测试日志
现在,我们来测试整个数据流是否通畅。
发送日志到 Logstash
打开一个新的终端,使用 netcat (或 nc) 工具向 Logstash 的 5000 端口发送一条 JSON 格式的日志。
echo '{"level": "info", "service": "my-app", "message": "这是一个测试日志"}' | nc localhost 5000
如果您没有 nc,也可以使用 curl:
curl -X POST -H "Content-Type: application/json" -d '{"level": "info", "service": "my-app", "message": "这是另一个测试日志"}' http://localhost:5000
注意:此处的 curl 能否成功取决于您的 input 插件,对于 tcp 插件,nc 是更可靠的测试工具。
在 Kibana 中查看日志
打开 Kibana 界面 (http://localhost:5601)。
点击左上角的汉堡菜单 (☰),进入 Management > Stack Management。
在 Kibana 分类下,选择 Data Views (或旧版中的 Index Patterns)。
点击 Create data view。
在 Name 和 Index pattern 字段中输入 logstash-*,Kibana 应该会自动识别出我们刚刚创建的索引。
点击 Save data view to Kibana。
创建成功后,再次点击左上角的汉堡菜单 (☰),进入 Analytics > Discover。
应该能看到刚刚发送的那条测试日志了!可以展开日志条目查看详细的 JSON 字段。
若是想监控jar包,可以参考
https://blog.csdn.net/CodeTom/article/details/148954231?sharetype=blogdetail&sharerId=148954231&sharerefer=PC&sharesource=CodeTom&spm=1011.2480.3001.8118