服务器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 服务名 查看日志,再根据关键字搜索,比盲目修改配置更有效。

分享到:
上一篇
服务器Zabbix教程:从零搭建监控系统与告警配置
下一篇
服务器Loki教程:用Docker和Nginx搭建日志收集系统
1
系统公告

泽御云中秋国庆双节活动上线:新购8折,拼团3.99元起

尊敬的用户:
泽御云“月满中秋·礼贺国庆”双节活动现已开启,活动时间为2026年9月23日至10月10日。 活动期间可享以下福利:
1. 常规云服务器新购使用优惠码“泽御中秋国庆同乐”,符合条件的订单享8折优惠。
2. 香港精品云服务器5人拼团低至3.99元,部分4核4G套餐3人拼团年付388元,续费同价。
3. 新用户购买年付云服务器,符合活动规则可赠送2个月使用时长。
4. 老用户续费季度赠15天,续费年度赠2个月;活动期间升级配置免收配置迁移手续费。
5. 推荐好友成功下单,符合条件的推荐人可获赠7天服务器使用时长。
6. 活动期间享宕机补偿标准翻倍、简单网站迁移协助及技术工单优先处理权益。
温馨提示:优惠码不适用于拼团套餐、活动轻量产品、年付订单及续费订单;拼团套餐为独立特价活动,不与赠时类福利叠加。赠送时长不可折现、退款或跨账户转移,具体规则以活动页面说明为准。
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意