一、部署前置准备

1.1 环境要求

  • 操作系统:Linux(CentOS 7+/Ubuntu 20.04+),推荐 2C8G 及以上配置(ES 对内存要求高)

  • 已安装:Docker 20.10+、Docker Compose V2+

  • 系统参数调整(必须,否则 ES 启动失败):
    # 临时调整内核参数(重启失效)
    sysctl -w vm.max_map_count=262144
    # 永久调整(重启生效)
    echo "vm.max_map_count=262144" >> /etc/sysctl.conf
    # 生效配置
    sysctl -p

1.2 目录结构规划

先创建统一的 ELK 部署目录,确保文件挂载和持久化:


# 创建核心目录
mkdir -p /opt/elk/{es/config,es/data,es/plugins,logstash/config,logstash/pipeline,kibana/config}
# 授权(避免容器权限不足)
chmod -R 777 /opt/elk

最终目录结构:


/opt/elk/
├──docker-compose.yml       # 核心编排文件
├──es/
│   ├──config/elasticsearch.yml# ES 配置文件
│   ├──data/                     # ES 数据持久化目录
│   └──plugins/                  # ES 插件目录
├──logstash/
│   ├──config/logstash.yml       # Logstash 主配置
│   └──pipeline/logstash.conf    # Logstash 管道配置(数据采集规则)
└──kibana/
    └──config/kibana.yml         # Kibana 配置文件


二、编写核心配置文件

2.1 Elasticsearch 配置文件

路径:/opt/elk/es/config/elasticsearch.yml


# 集群名称(ELK 集群统一)
cluster.name:elk-cluster
# 节点名称(单机单节点)
node.name:es-node-1
# 数据存储路径(对应容器内路径)
path.data:/usr/share/elasticsearch/data
# 日志路径
path.logs:/usr/share/elasticsearch/logs
# 绑定地址(允许所有IP访问)
network.host:0.0.0.0
# HTTP端口(默认9200)
http.port:9200
# 集群发现(单机模式,禁用自动发现)
discovery.type:single-node
# 关闭安全认证(新手部署简化,生产需开启)
xpack.security.enabled:false
xpack.security.enrollment.enabled:false
# 关闭HTTPS(新手简化)
xpack.security.http.ssl.enabled:false
xpack.security.transport.ssl.enabled:false
# JVM内存限制(根据服务器配置调整,默认1G,推荐2G)
# 注:此配置也可在docker-compose中通过环境变量设置
# ES_JAVA_OPTS: "-Xms2g -Xmx2g"

2.2 Logstash 主配置文件

路径:/opt/elk/logstash/config/logstash.yml


# 节点名称
node.name:logstash-node-1
# Logstash监听端口(用于Kibana管理)
http.host:0.0.0.0
http.port:9600
# 管道配置自动加载
config.reload.automatic:true
# 配置文件编码
config.support_escapes:true
# 日志级别
log.level:info
# 禁用安全认证(新手简化)
xpack.monitoring.enabled:false
xpack.security.enabled:false

2.3 Logstash 管道配置(核心)

路径:/opt/elk/logstash/pipeline/logstash.conf


# 输入:监听5044端口(接收Filebeat数据)+ 标准输入(测试用)
input {
  beats {
    port => 5044
  }
  stdin {
    codec => "json"
  }
}

# 过滤:可选(示例:解析Nginx日志,新手可注释)
filter {
  # 示例:解析Nginx access.log
  # grok {
  #   match => { "message" => "%{COMBINEDAPACHELOG}" }
  # }
  # date {
  #   match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
  # }
}

# 输出:发送到Elasticsearch
output {
  elasticsearch {
    hosts => ["es:9200"]  # 对应docker-compose中ES的服务名
    index => "logstash-%{+YYYY.MM.dd}"  # 按日期分索引
  }
  # 控制台输出(测试用,生产可注释)
  stdout {
    codec => rubydebug
  }
}

2.4 Kibana 配置文件

路径:/opt/elk/kibana/config/kibana.yml


# 服务器绑定地址
server.host: 0.0.0.0
# Elasticsearch地址(对应docker-compose中ES的服务名)
elasticsearch.hosts: ["http://es:9200"]
# 禁用安全认证(新手简化)
xpack.security.enabled: false
xpack.encryptedSavedObjects.encryptionKey: "a_random_string_at_least_32_characters"
# 中文界面(可选)
i18n.locale: "zh-CN"

2.5 Docker Compose 核心编排文件

路径:/opt/elk/docker-compose.yml


version: '3.8'

services:
# Elasticsearch 服务
es:
    image:elasticsearch:8.14.0# 版本可替换为7.17.x
    container_name:elk-es
    restart:always
    environment:
      -"ES_JAVA_OPTS=-Xms2g -Xmx2g"# JVM内存限制(关键)
      -"TZ=Asia/Shanghai"# 时区
    ports:
      -"9200:9200"# HTTP端口
      -"9300:9300"# 集群通信端口
    volumes:
      -./es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
      -./es/data:/usr/share/elasticsearch/data
      -./es/plugins:/usr/share/elasticsearch/plugins
    networks:
      -elk-network

# Logstash 服务
logstash:
    image:logstash:8.14.0
    container_name:elk-logstash
    restart:always
    environment:
      -"LS_JAVA_OPTS=-Xms1g -Xmx1g"
      -"TZ=Asia/Shanghai"
    ports:
      -"5044:5044"# beats输入端口
      -"9600:9600"# 监控端口
    volumes:
      -./logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml
      -./logstash/pipeline:/usr/share/logstash/pipeline
    depends_on:
      -es# 依赖ES,先启动ES
    networks:
      -elk-network

# Kibana 服务
kibana:
    image:kibana:8.14.0
    container_name:elk-kibana
    restart:always
    environment:
      -"TZ=Asia/Shanghai"
    ports:
      -"5601:5601"# Kibana访问端口
    volumes:
      -./kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml
    depends_on:
      -es
    networks:
      -elk-network

# 自定义网络(隔离ELK服务)
networks:
elk-network:
    driver:bridge


三、部署与管理命令

3.1 启动 ELK 集群


# 进入部署目录
cd /opt/elk
# 后台启动(推荐)
docker-compose up -d
# 前台启动(查看实时日志,调试用)
# docker-compose up

3.2 查看启动状态


# 查看容器状态
docker-compose ps
# 查看指定服务日志(如ES)
docker-compose logs -f es
# 查看所有服务日志
docker-compose logs -f

3.3 验证部署结果

  1. 验证 Elasticsearch:

    curl http://localhost:9200
      

    正常输出(示例):

    {
      "name":"es-node-1",
    "cluster_name":"elk-cluster",
    "version":{
        "number":"8.14.0",
        "build_flavor":"default",
        "build_type":"docker"
    },
    "tagline":"You Know, for Search"
    }
  2. 验证 Kibana: 浏览器访问 http://服务器IP:5601,能看到 Kibana 中文界面即成功。

  3. 测试 Logstash:

    # 进入Logstash容器
    docker exec -it elk-logstash /bin/bash
    # 输入测试数据
    echo '{"message":"test elk log","level":"info"}'

    查看 ES 索引:curl http://localhost:9200/_cat/indices,能看到 logstash-YYYY.MM.dd 索引即成功。

3.4 停止/重启/删除


# 停止ELK
docker-compose stop
# 重启ELK
docker-compose restart
# 停止并删除容器(数据卷保留)
docker-compose down
# 停止并删除容器+数据卷(谨慎,数据会丢失)
docker-compose down -v


四、常见问题解决

  1. ES 启动失败:检查 vm.max_map_count 参数是否设置为 262144,或内存不足(调小 ES_JAVA_OPTS)。

  2. Kibana 提示无法连接 ES:检查 kibana.yml 中 elasticsearch.hosts 是否为 http://es:9200(对应docker-compose服务名)。

  3. Logstash 无输出:检查管道配置 logstash.conf 语法,可通过 docker exec -it elk-logstash logstash -f /usr/share/logstash/pipeline/logstash.conf --config.test_and_exit 验证配置语法。


总结

  1. 核心前提:部署前必须调整内核参数 vm.max_map_count=262144,否则 ES 启动失败。

  2. 配置关键

    • ES 核心配置:禁用安全认证(新手)、设置单机模式、绑定 0.0.0.0 允许外部访问;

    • Logstash 核心:管道配置(input/filter/output)需指向 ES 服务名;

    • Kibana 核心:指定 ES 地址、开启中文界面(可选)。

  3. 验证步骤:优先检查 ES 可用性,再验证 Kibana 访问,最后测试 Logstash 数据输出。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐