ElasticSearch

根据你的 Docker 版本(Docker 28.1.1 + Compose v2.38.2),以下是专为 Elasticsearch 8.x 优化的 docker-compose.yml 配置文件,包含详细注释和最佳实践:

docker-compose.yml

version: '3.8'  # Docker Compose v2.38.2 支持的版本

services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.12.2  # 官方镜像
    container_name: elasticsearch
    environment:
      - discovery.type=single-node          # 单节点模式(开发环境推荐)
      - ES_JAVA_OPTS=-Xms2g -Xmx2g          # JVM堆内存设置(根据机器内存调整)
      - xpack.security.enabled=false        # 禁用安全认证(仅限本地开发环境)
      - cluster.routing.allocation.disk.threshold_enabled=false  # 禁用磁盘阈值检查
      - ingest.geoip.downloader.enabled=false # 禁用GeoIP下载(减少启动时间)
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - es_data:/usr/share/elasticsearch/data  # 数据持久化
    ports:
      - "9200:9200"  # REST API
      - "9300:9300"  # 节点通信
    networks:
      - es_net
    healthcheck:
      test: ["CMD-SHELL", "curl -s http://localhost:9200/_cluster/health | grep -qE '\"status\":\"(green|yellow)\"'"]
      interval: 10s
      timeout: 10s
      retries: 30

volumes:
  es_data:
    driver: local

networks:
  es_net:
    driver: bridge
    name: es_network  # 自定义网络名称

使用说明

  1. 启动服务
bashdocker-compose up -d
  1. 验证服务状态
bashdocker logs -f elasticsearch  # 查看启动日志curl http://localhost:9200    # 应返回JSON格式的集群信息
  1. 关键目录权限设置(首次启动前执行)
bashsudo mkdir -p /var/lib/docker/volumes/es_datasudo chown -R 1000:1000 /var/lib/docker/volumes/es_data  # Elasticsearch默认UID

配置说明

  1. 版本选择
  • 使用 8.12.2 镜像(Elasticsearch 8.x 的最新稳定版本)
  • 兼容 Docker 28.1.1 的容器运行时
  1. 内存优化
  • ES_JAVA_OPTS=-Xms2g -Xmx2g 限制 JVM 堆内存为 2GB
  • 如果机器内存 < 8GB,建议改为 -Xms1g -Xmx1g
  1. 安全配置
  • xpack.security.enabled=false 禁用基础认证(仅限本地开发环境)
  • 生产环境应启用安全功能并配置密码
  1. 数据持久化
  • 使用 Docker Volume es_data 保存数据
  • 数据目录实际路径:/var/lib/docker/volumes/es_data/_data

常见问题处理

  1. 虚拟内存不足
bash# 临时设置sudo sysctl -w vm.max_map_count=262144 # 永久生效echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.confsudo sysctl -p
  1. 磁盘空间监控
  • 如果遇到 disk usage exceeded flood-stage watermark 错误:
bashcurl -X PUT "localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d'{  "persistent": {    "cluster.routing.allocation.disk.watermark.low": "90%",    "cluster.routing.allocation.disk.watermark.high": "95%",    "cluster.routing.allocation.disk.watermark.flood_stage": "98%"  }}'
  1. 升级版本
    修改 image 字段的版本号后执行:
bashdocker-compose pulldocker-compose up -d

如果需要添加 Kibana 或配置安全认证,可以告诉我帮你扩展配置!

Logstash

创建目录 configpipeline
在目录config中创建

logstash.yml

http.host: "0.0.0.0"
http.port: 9600

pipelines.yml

- pipeline.id: main
  path.config: "/usr/share/logstash/pipeline/logstash.conf"  # 管道配置文件路径

生产环境建议配置

# logstash/config/logstash.yml
http.host: "0.0.0.0"
xpack.monitoring.enabled: true
xpack.monitoring.elasticsearch.hosts: ["http://elasticsearch:9200"]

在目录 pipeline 中创建

logstash.conf

input {
  tcp {
    port => 5000
    codec => json
  }
}
output {
  elasticsearch {
    hosts => ["http://elasticsearch:9200"]
    index => "logs-%{+YYYY.MM.dd}"
  }
}

docker-compose.yml

version: '3.8'

services:
  logstash:
    image: docker.elastic.co/logstash/logstash:8.12.2
    container_name: logstash
    command: logstash -f /usr/share/logstash/pipeline/logstash.conf
    environment:
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200  # 使用服务名访问ES
      - LS_JAVA_OPTS=-Xmx2g -Xms2g
    volumes:
      - ./config:/usr/share/logstash/config
      - ./pipeline:/usr/share/logstash/pipeline  
    ports:
      - "5044:5044"
      - "9600:9600"
      - "5601:5601"
      - "5000:5000/tcp"
      - "5000:5000/udp"
    networks:
      - es_net  # 加入Elasticsearch的自定义网络

networks:
  es_net:
    external: true  # 声明使用已存在的外部网络
    name: es_network  # 指定与ES相同的网络名称

验证

可以通过以下步骤验证Logstash是否运行正常:

1. 检查容器状态

# 查看所有容器状态
docker-compose ps

# 预期输出(状态应为Up)
NAME                COMMAND                  SERVICE             STATUS              PORTS
logstash            "/usr/local/bin/docke..."   logstash            running             0.0.0.0:5000->5000/tcp, 0.0.0.0:5044->5044/tcp

2. 查看实时日志

# 查看所有容器状态
docker-compose ps

# 预期输出(状态应为Up)
NAME                COMMAND                  SERVICE             STATUS              PORTS
logstash            "/usr/local/bin/docke..."   logstash            running             0.0.0.0:5000->5000/tcp, 0.0.0.0:5044->5044/tcp

3. 发送测试数据

通过TCP端口发送数据

# 安装netcat(如果未安装)
sudo apt-get install netcat -y
 
# 发送测试JSON数据到5000端口
echo '{"message": "test logstash", "timestamp": "2025-07-14T13:30:00Z"}' | nc localhost 5000

通过Beats端口发送数据

# 使用Filebeat发送测试日志(需安装Filebeat)
./filebeat test input -e -E input.type=stdin

4. 验证Elasticsearch数据

# 查询最新索引
curl -u elastic:changeme http://localhost:9200/_cat/indices?v

# 预期输出(包含logstash开头的索引)
green open logstash-2025.07.14   ABCDEFG 1 0 1 0 283b 283b

# 查看具体文档
curl -u elastic:changeme http://localhost:9200/logstash-2025.07.14/_search?pretty

5. Kibana可视化验证

  1. 打开Kibana(http://localhost:5601)
  2. 进入 Management > Stack Management > Index Patterns
  3. 创建索引模式 logstash-*
  4. 进入 Discover 页面,选择时间范围为最近15分钟
  5. 应该能看到刚刚发送的测试数据

6. 性能监控指标

# 查看Logstash监控API
curl http://localhost:9600/_node/stats

# 关键指标:
- "events": { "in": 1, "out": 1 }  # 事件处理计数
- "pipeline": { "workers": 4 }    # 管道工作线程数
- "jvm": { "mem": { "heap_used_percent": 15 } }  # 内存使用率

常见问题排查

1. 连接Elasticsearch失败

log[ERROR][logstash.outputs.elasticsearch] Attempted to resurrect connection to dead ES instance

解决方案:

  • 检查ES容器是否运行
  • 验证网络配置:docker network inspect es_network
  • 测试连通性:docker exec -it logstash curl http://elasticsearch:9200

2. 管道配置错误

log[FATAL][logstash.runner] An unexpected error occurred! {:error=>#<LogStash::ConfigurationError: Something is wrong with your configuration.>}

解决方案:

# 测试配置文件语法
docker-compose run --rm logstash logstash -t -f /usr/share/logstash/pipeline/logstash.conf