使用Docker快速搭建ELK日志分析平台

举报
努力向上 发表于 2026/05/07 15:28:49 2026/05/07
【摘要】 前言ELK 是 Elasticsearch、Logstash、Kibana 三大开源工具的首字母缩写,广泛应用于日志收集、搜索和分析场景。本文将带你使用 Docker 快速搭建一套 ELK 环境,适合开发测试和小规模生产使用。环境准备操作系统:LinuxDocker 版本:20.10+Docker Compose 版本:2.0+内存建议:至少 4GB(ES 比较吃内存)快速开始1. 安装do...

前言

ELK 是 Elasticsearch、Logstash、Kibana 三大开源工具的首字母缩写,广泛应用于日志收集、搜索和分析场景。本文将带你使用 Docker 快速搭建一套 ELK 环境,适合开发测试和小规模生产使用。

环境准备

  • 操作系统:Linux

  • Docker 版本:20.10+

  • Docker Compose 版本:2.0+

  • 内存建议:至少 4GB(ES 比较吃内存)

快速开始

1. 安装docker


curl -fsSL https://mirrors.huaweicloud.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
echo "" | sudo add-apt-repository "deb [arch=amd64] https://mirrors.huaweicloud.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
echo "y" | apt-get update
sleep 10
echo "y" | apt-get install docker-ce


# 配置docker镜像仓
echo '{"registry-mirrors": ["https://docker.1ms.run"]}' >/etc/docker/daemon.json
systemctl restart docker

2.创建项目目录

mkdir elk-docker && cd elk-docker
vim docker-compose.yml

3. 编写 docker-compose.yml

version: '3.8'

services:
  # ==================== Elasticsearch ====================
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0
    container_name: elk-elasticsearch
    restart: unless-stopped
    environment:
      # 单节点模式
      - discovery.type=single-node
      # 关闭安全认证(简化部署,生产环境建议开启)
      - xpack.security.enabled=false
      # 关闭监控功能(节省资源)
      - xpack.monitoring.collection.enabled=false
      # JVM 堆内存大小(根据你的机器内存调整)
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
    ports:
      # HTTP API 端口
      - "9200:9200"
      # 集群内部通信端口(不需要暴露到宿主机也可以)
      - "9300:9300"
    volumes:
      # 数据持久化(防止容器删除后数据丢失)
      - es-data:/usr/share/elasticsearch/data
      # 可选:挂载配置文件
      # - ./elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro
    networks:
      - elk-network
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9200"]
      interval: 30s
      timeout: 10s
      retries: 5

  # ==================== Logstash ====================
  logstash:
    image: docker.elastic.co/logstash/logstash:8.11.0
    container_name: elk-logstash
    restart: unless-stopped
    ports:
      # Beats 协议端口(Filebeat 使用)
      - "5044:5044"
      # TCP 端口(通过 TCP 发送日志,如 Java 应用)
      - "5000:5000"
      # UDP 端口
      - "5000:5000/udp"
    volumes:
      # 挂载 Logstash 管道配置文件
      - ./logstash/pipeline/:/usr/share/logstash/pipeline/:ro
      - /home/hermes/.hermes/sessions:/data/hermes-logs:ro
      - ./logstash/data:/usr/share/logstash/data
      # 可选:挂载 Logstash 配置文件
      # - ./logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml:ro
    environment:
      # JVM 堆内存设置
      - LS_JAVA_OPTS=-Xms256m -Xmx256m
    depends_on:
      elasticsearch:
        condition: service_healthy
    networks:
      - elk-network

  # ==================== Kibana ====================
  kibana:
    image: docker.elastic.co/kibana/kibana:8.11.0
    container_name: elk-kibana
    restart: unless-stopped
    ports:
      - "5601:5601"
    environment:
      # 连接 Elasticsearch 的地址(注意:使用服务名而不是 localhost)
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
      # 设置中文界面
      - I18N_LOCALE=zh-CN
      # Kibana 服务器配置
      - SERVER_NAME=kibana
      - SERVER_HOST=0.0.0.0
    depends_on:
      elasticsearch:
        condition: service_healthy
    networks:
      - elk-network
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:5601/api/status"]
      interval: 30s
      timeout: 10s
      retries: 5

# ==================== 数据卷定义 ====================
volumes:
  es-data:
    driver: local

# ==================== 网络定义 ====================
networks:
  elk-network:
    driver: bridge

4. 配置 Logstash 管道

创建 Logstash 配置文件目录和管道文件:

mkdir -p logstash/pipeline
vim logstash/pipeline/logstash.conf

创建 logstash/pipeline/logstash.conf

input {
  # 从 TCP 端口接收日志(可用于 Filebeat 等)
  tcp {
    port => 5000
    codec => json_lines
  }
  # 从标准输入接收(用于测试)
  stdin { }
}

filter {
  # 如果有必要,可以在这里添加过滤规则
  # 例如:解析 Nginx 日志、提取字段等
  grok {
    match => { "message" => "%{COMBINEDAPACHELOG}" }
  }
  
  date {
    match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
  }
}

output {
  elasticsearch {
    hosts => ["elasticsearch:9200"]
    index => "logstash-%{+YYYY.MM.dd}"
  }
  stdout { codec => rubydebug }}
}

4. 启动服务

注:在有docker-compose.yaml的目录下执行
docker compose up -d

查看启动状态:

docker compose ps

查看日志:

docker-compose logs -f

5. 验证服务

  • Elasticsearch:访问 http://弹性IP:9200

  • Kibana:访问 http://弹性IP:5601

  • Logstash:TCP 端口 5000 已开放

注:需要开通9200、5601的端口

测试日志收集

方法一:使用 netcat 发送日志

echo '{"message":"Hello ELK", "level":"info"}' | nc localhost 5000

方法二:使用 Logstash 的 stdin 输入

进入 Logstash 容器:

docker exec -it elk-logstash bash

然后在容器内输入任意字符,观察日志是否被解析并输出到 Elasticsearch。

Kibana 基础配置

  1. 打开浏览器访问 http://localhost:5601

  2. 左侧菜单进入 Management → Stack Management → Kibana → Index Patterns

  3. 点击 Create index pattern

  4. 输入 logstash-*,点击 Next step

  5. 选择 @timestamp 作为时间字段,点击 Create index pattern

  6. 进入 Discover 页面,即可查看收集到的日志

常用命令

# 停止服务
docker compose down

# 停止并删除数据卷(清空所有数据)
docker compose down -v

# 重启单个服务
docker compose restart elk-elasticsearch

# 查看容器资源占用
docker stats

# 进入容器调试
docker exec -it elk-elasticsearch bash

常见问题

1. Elasticsearch 启动失败(vm.max_map_count 过小)

解决方案

# 宿主机执行
sudo sysctl -w vm.max_map_count=262144

# 永久修改
echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf

2. Kibana 无法连接 Elasticsearch

检查 Kibana 环境变量中的 ELASTICSEARCH_HOSTS 是否正确,确认 ES 已经启动完成(可能需要等待 30 秒)。

3. 端口冲突

修改 docker-compose.yml 中映射的主机端口,例如 "5602:5601"

4. 日志量太大导致磁盘不足

定期清理索引或缩短索引保留时间。可通过 Kibana 的 ILM(索引生命周期管理)配置自动删除。

生产环境注意事项

  1. 开启安全认证:启用 Elasticsearch 的 xpack.security

  2. 数据持久化:已通过 volume 实现

  3. 资源限制:合理设置 JVM 堆内存(ES_JAVA_OPTS

  4. 集群部署:单节点仅适合测试,生产请使用多节点集群

  5. 日志采集:使用 Filebeat 替代直接发送到 Logstash

总结

通过 Docker 我们可以快速搭建一套可用的 ELK 日志平台,整个过程只需要几分钟。虽然这个配置适合开发和测试环境,但它已经包含了 ELK 的核心功能。希望本文能帮助你快速入门 ELK 技术栈!

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。