我的环境是用win11+wsl+docker desktop
前提条件
确保 WSL 中已安装 Docker 和 Docker Compose
确保你的 WSL 有足够的内存(至少 4GB 推荐给 Docker)
检查安装:
bash
docker –version
docker-compose –version
第一步:创建项目目录结构
创建一个专门的项目目录来存放所有配置文件:
bash
mkdir elk-filebeat-demo
cd elk-filebeat-demo
mkdir -p filebeat/{data,logs}
第二步:创建 Docker Compose 文件
创建 docker-compose.yml 文件:
bash
nano docker-compose.yml
将以下内容复制到文件中:
yaml
version: '3.8'
services:
# Elasticsearch
elasticsearch:
image:
docker.elastic.co/elasticsearch/elasticsearch:7.17.21 # 使用 7.x 版本以兼容 JDK8
container_name: elasticsearch
environment:
– discovery.type=single-node
– “ES_JAVA_OPTS=-Xms512m -Xmx512m” # 限制内存使用
– xpack.security.enabled=false # 学习环境禁用安全认证
volumes:
– elasticsearch_data:/usr/share/elasticsearch/data
ports:
– “9200:9200”
networks:
– elk-network
restart: unless-stopped
# Kibana
kibana:
image: docker.elastic.co/kibana/kibana:7.17.21
container_name: kibana
environment:
– ELASTICSEARCH_HOSTS=http://elasticsearch:9200
ports:
– “5601:5601”
networks:
– elk-network
depends_on:
– elasticsearch
restart: unless-stopped
# Logstash
logstash:
image: docker.elastic.co/logstash/logstash:7.17.21
container_name: logstash
environment:
– LS_JAVA_OPTS=-Xmx256m -Xms256m
volumes:
– ./logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml:ro
– ./logstash/pipeline:/usr/share/logstash/pipeline:ro
ports:
– “5044:5044”
networks:
– elk-network
depends_on:
– elasticsearch
restart: unless-stopped
# Filebeat
filebeat:
image: docker.elastic.co/beats/filebeat:7.17.21
container_name: filebeat
user: root # 需要 root 权限读取日志文件
volumes:
– ./filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml:ro
– ./filebeat/data:/usr/share/filebeat/data:rw
– ./filebeat/logs:/usr/share/filebeat/logs:rw
– /var/log:/var/log:ro # 挂载宿主机的日志目录
–
/var/lib/docker/containers:/var/lib/docker/containers:ro # 收集 Docker 容器日志
networks:
– elk-network
depends_on:
– elasticsearch
– logstash
restart: unless-stopped
# 定义网络和卷
networks:
elk-network:
driver: bridge
volumes:
elasticsearch_data:
driver: local
第三步:创建 Logstash 配置
创建配置目录和文件:
bash
mkdir -p logstash/{config,pipeline}
创建 Logstash 主配置文件:
bash
nano logstash/config/logstash.yml
内容:
yaml
http.host: “0.0.0.0”
path.config: /usr/share/logstash/pipeline
创建 Logstash 管道配置文件:
bash
nano logstash/pipeline/logstash.conf
内容:
ruby
input {
beats {
port => 5044
}
}
# 简单的过滤,可以按需扩展
filter {
# 如果是系统日志,可以解析时间戳等
if [fileset][module] == “system” {
if [fileset][name] == “auth” {
grok {
match => { “message” => [“%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} sshd(?:[%{POSINT:[system][auth][pid]}])?: %{DATA:[system][auth][ssh][event]} %{DATA:[system][auth][ssh][method]} for (invalid user )?%{DATA:[system][auth][user]} from %{IPORHOST:[system][auth][ssh][ip]} port %{NUMBER:[system][auth][ssh][port]} ssh2(: %{GREEDYDATA:[system][auth][ssh][signature]})?”,
“%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} sshd(?:[%{POSINT:[system][auth][pid]}])?: %{DATA:[system][auth][ssh][event]} user %{DATA:[system][auth][user]} from %{IPORHOST:[system][auth][ssh][ip]}”,
“%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} sshd(?:[%{POSINT:[system][auth][pid]}])?: Did not receive identification string from %{IPORHOST:[system][auth][ssh][ip]}”,
“%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} sudo(?:[%{POSINT:[system][auth][pid]}])?: s*%{DATA:[system][auth][user]} 🙁 %{DATA:[system][auth][sudo][error]} ;)? TTY=%{DATA:[system][auth][sudo][tty]} ; PWD=%{DATA:[system][auth][sudo][pwd]} ; USER=%{DATA:[system][auth][sudo][user]} ; COMMAND=%{GREEDYDATA:[system][auth][sudo][command]}”,
“%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} groupadd(?:[%{POSINT:[system][auth][pid]}])?: new group: name=%{DATA:system.auth.groupadd.name}, GID=%{NUMBER:system.auth.groupadd.gid}”,
“%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} useradd(?:[%{POSINT:[system][auth][pid]}])?: new user: name=%{DATA:[system][auth][user][add][name]}, UID=%{NUMBER:[system][auth][user][add][uid]}, GID=%{NUMBER:[system][auth][user][add][gid]}, home=%{DATA:[system][auth][user][add][home]}, shell=%{DATA:[system][auth][user][add][shell]}$”,
“%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} %{DATA:[system][auth][program]}(?:[%{POSINT:[system][auth][pid]}])?: %{GREEDYMULTILINE:[system][auth][message]}”] }
pattern_definitions => {
“GREEDYMULTILINE”=> “(.|
)*”
}
remove_field => “message”
}
date {
match => [ “[system][auth][timestamp]”, “MMM d HH:mm:ss”, “MMM dd HH:mm:ss” ]
}
}
}
}
output {
elasticsearch {
hosts => [“elasticsearch:9200”]
index => “%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}”
}
# stdout { codec => rubydebug } # 撤销注释可以在控制台看到日志,用于调试
}
第四步:创建 Filebeat 配置
创建 Filebeat 配置文件:
bash
nano filebeat/filebeat.yml
内容:
yaml
filebeat.inputs:
– type: log
enabled: true
paths:
– /var/log/*.log
– /var/log/auth.log
– /var/log/syslog
fields:
log_type: system
– type: log
enabled: true
paths:
– /var/lib/docker/containers/*/*.log
fields:
log_type: docker
# 设置模块路径
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
# 输出到 Logstash
output.logstash:
hosts: [“logstash:5044”]
# 日志记录设置(可选,用于调试)
logging.level: info
logging.to_files: true
logging.files:
path: /usr/share/filebeat/logs
name: filebeat
keepfiles: 7
第五步:启动 ELK 栈
目前一切就绪,启动所有服务:
bash
docker-compose up -d
检查服务状态:
bash
docker-compose ps
查看日志(如果需要调试):
bash
docker-compose logs -f elasticsearch
# 或者查看特定服务日志
docker-compose logs -f filebeat
第六步:验证和访问
检查 Elasticsearch:
bash
curl http://localhost:9200
访问 Kibana:
在 Windows 浏览器中打开:http://localhost:5601
在 Kibana 中创建索引模式:
进入 Kibana → Management → Stack Management → Index Patterns
点击 “Create index pattern”
输入 filebeat-*
选择 @timestamp 作为时间字段
点击 “Create index pattern”
查看日志:
进入 Kibana → Analytics → Discover
选择 filebeat-* 索引模式
你应该能看到收集到的系统日志
常用命令
bash
# 停止所有服务
docker-compose down
# 停止并删除数据卷(彻底清理)
docker-compose down -v
# 查看服务状态
docker-compose ps
# 查看实时日志
docker-compose logs -f
# 重启特定服务
docker-compose restart filebeat
优势说明
使用 Docker Compose 方式的好处:
隔离性:所有组件在容器中运行,不影响宿主机
一致性:版本匹配,避免兼容性问题
可重复性:配置文件化,容易重现和分享
易清理:一条命令即可完全清理环境
目前你就可以开始探索 ELK 栈的功能了!你可以修改 Filebeat 配置来收集其他日志文件,或者学习 Logstash 的过滤规则来解析特定格式的日志。
执行docker-compose up -d要先进入wsl的磁盘目录
必须要在 Docker Compose 文件所在的目录下执行命令,否则 Docker Compose 找不到 docker-compose.yml 文件。
正确的步骤应该是:
在 WSL 中切换到你的项目目录(根据你的实际路径):
bash
# 如果你的项目在 Windows 的 F:wslprojectelk-filebeat-demo
# 在 WSL 中对应的路径可能是:
cd /mnt/f/wsl/project/elk-filebeat-demo
# 或者如果你的项目在 WSL 的家目录中
cd ~/elk-filebeat-demo
确认当前目录下有 docker-compose.yml 文件:
bash
ls -la
你应该能看到:
text
docker-compose.yml
filebeat/
logstash/
然后才启动服务:
bash
docker-compose up -d
关于 WSL 文件路径的重大说明
在 WSL 中有两种文件存储位置:
方案一:放在 Windows 文件系统中(/mnt/…)
路径:
/mnt/f/wsl/project/elk-filebeat-demo
优点:文件在 Windows 中可见,方便用 VS Code 等工具编辑
缺点:I/O 性能稍差(但对于学习环境影响不大)
方案二:放在 WSL 原生文件系统中(~/ 或 /home/username/…)
路径:~/elk-filebeat-demo 或 /home/你的用户名/elk-filebeat-demo
优点:I/O 性能更好
缺点:在 Windows 文件资源管理器中不可直接访问
检查你是否在正确目录的方法
bash
# 查看当前目录
pwd
# 查看目录内容
ls -la
# 确认有 docker-compose.yml 文件
ls docker-compose.yml
如果显示 No such file or directory,说明你不在正确的目录。
完整的正确流程示例:
bash
# 1. 进入项目目录(根据你的实际路径选择)
cd /mnt/f/wsl/project/elk-filebeat-demo
# 2. 确认文件存在
ls -la
# 3. 启动服务
docker-compose up -d
# 4. 检查服务状态
docker-compose ps
# 5. 查看日志
docker-compose logs -f elasticsearch
如果已经在错误的位置启动了怎么办?
如果在错误目录执行了 docker-compose up -d,需要先停止:
bash
# 在原来的错误目录下停止服务
docker-compose down
# 然后切换到正确目录再启动
cd /正确的/路径/elk-filebeat-demo
docker-compose up -d
总结:必须先进入包含 docker-compose.yml 文件的目录,然后再执行启动命令。





