服务器ELK教程:用Docker Compose搭建日志分析系统
ELK 是 Elasticsearch、Logstash、Kibana 三个开源组件的组合,常用来集中收集、存储和检索服务器日志。
对于零基础用户,最省事的做法是在一台 Linux 服务器上用 Docker Compose 把三个服务同时跑起来。
这篇服务器 ELK 教程按单机测试环境编写,适合个人学习或中小项目初期使用,生产环境还需要额外考虑权限、备份和集群规划。
准备条件
开始前请确认服务器满足以下条件,否则启动时很容易报错:
- 操作系统:Ubuntu 22.04 或 CentOS 7 及以上,64 位。
- 内存:建议 4GB 以上,Elasticsearch 默认会占用较多内存。
- 磁盘:至少 20GB 可用空间,日志量越大预留越多。
- 软件:已安装 Docker 和 Docker Compose 插件。
检查 Docker 是否可用:
docker --version
docker compose version
如果第二条命令报错,说明 Compose 插件未安装,可先安装 docker-compose-plugin。
Elasticsearch 对系统资源有硬性要求,提前调整两处内核参数:
# 临时生效,重启后失效
sudo sysctl -w vm.max_map_count=262144
# 永久写入配置
echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf
再提高文件描述符限制,编辑 /etc/security/limits.conf,追加:
* soft nofile 65536
* hard nofile 65536
修改后需要重新登录终端或重启服务器生效。
编写 Docker Compose 配置
新建目录并进入:
mkdir -p /opt/elk && cd /opt/elk
创建 docker-compose.yml,内容如下:
version: '3.8'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.13.4
container_name: elk-es
environment:
- discovery.type=single-node
- xpack.security.enabled=false
- ES_JAVA_OPTS=-Xms1g -Xmx1g
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- es-data:/usr/share/elasticsearch/data
ports:
- "9200:9200"
logstash:
image: docker.elastic.co/logstash/logstash:8.13.4
container_name: elk-ls
volumes:
- ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
ports:
- "5044:5044"
depends_on:
- elasticsearch
kibana:
image: docker.elastic.co/kibana/kibana:8.13.4
container_name: elk-kb
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
ports:
- "5601:5601"
depends_on:
- elasticsearch
volumes:
es-data:
注意 xpack.security.enabled=false 只适合本地测试,开启公网访问前务必启用安全认证。
配置 Logstash 输入输出
在 /opt/elk 下新建 logstash.conf,先做一个最简单的标准输入测试:
input {
beats {
port => 5044
}
}
output {
elasticsearch {
hosts => ["http://elasticsearch:9200"]
index => "test-logs-%{+YYYY.MM.dd}"
}
stdout { codec => rubydebug }
}
如果暂时没有 Filebeat,可以把 input 换成 stdin {} 做验证。
启动与验证
启动所有服务:
docker compose up -d
查看容器状态,三个服务都应为 running:
docker compose ps
验证 Elasticsearch 是否正常响应:
curl http://localhost:9200
返回 JSON 中包含 "tagline" : "You Know, for Search" 就说明 ES 已启动。
浏览器访问 http:,
//服务器IP:
5601
进入 Kibana 后依次点击 Stack Management → Index Patterns → Create index pattern,
输入 test-logs-* 完成创建,
再回到 Discover 页面即可看到日志。
常见报错与避坑
启动后 ES 容器自动退出:多半是 vm.max_map_count 未生效或内存不足。
执行 sudo sysctl vm.max_map_count 确认值为 262144,并检查宿主机剩余内存。
Kibana 页面提示 Kibana server is not ready yet:这是启动顺序问题,等待 1-2 分钟刷新即可。
如果一直不恢复,用 docker logs elk-kb 查看具体错误。
端口被占用:9200、5601、5044 任一端口被占用都会导致启动失败。
用 ss -tlnp | grep 端口号 排查,或修改 compose 文件左侧的宿主机端口。
不要在生产环境直接关闭 xpack 安全认证,也不要将 9200 端口直接暴露到公网。
测试完成后建议添加防火墙规则,仅放行必要来源 IP。
下一步可以做什么
单机 ELK 跑通后,可以在目标服务器安装 Filebeat,把日志发送到 5044 端口,再在 Kibana 中按日期或服务名建立索引模式。
日志量增长后,再考虑独立部署 Elasticsearch 集群和引入消息队列。
如果启动过程中遇到未列出的报错,优先用 docker compose logs 服务名 查看日志,再根据关键字搜索,比盲目修改配置更有效。