Docker 安装和配置 Elasticsearch 完整指南

Elasticsearch 作为最流行的开源搜索引擎,在大数据搜索和日志分析领域广泛应用。结合 Docker,我们可以快速部署和管理 Elasticsearch 集群。本文将详细介绍如何使用 Docker 安装和配置 Elasticsearch。

目录

  • Elasticsearch 简介

  • 环境准备

  • 单节点安装

  • 配置参数详解

  • 数据持久化

  • 集群部署

  • 安全配置

  • Kibana 集成

  • 常用操作

  • 故障排查

Elasticsearch 简介

Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,具有以下特点:

  • 实时搜索和分析

  • 分布式架构

  • 支持多租户

  • RESTful API

  • 支持结构化、非结构化数据

环境准备

系统要求

  • Docker 20.10+

  • 至少 4GB 内存

  • 2核 CPU

  • 20GB 磁盘空间

安装 Docker

bash

复制代码
# Ubuntu/Debian
sudo apt update
sudo apt install docker.io

# CentOS/RHEL
sudo yum install docker

# 启动 Docker
sudo systemctl start docker
sudo systemctl enable docker

# 验证安装
docker --version

单节点安装

快速启动

bash

复制代码
# 拉取最新镜像
docker pull docker.elastic.co/elasticsearch/elasticsearch:8.11.0

# 简单运行
docker run -d --name elasticsearch \
  -p 9200:9200 -p 9300:9300 \
  -e "discovery.type=single-node" \
  -e "xpack.security.enabled=false" \
  docker.elastic.co/elasticsearch/elasticsearch:8.11.0

验证安装

bash

复制代码
# 检查服务状态
curl -X GET "localhost:9200/"

# 预期输出
{
  "name" : "node-1",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "abcd1234",
  "version" : {
    "number" : "8.11.0",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "abcdef123456",
    "build_date" : "2023-01-01T00:00:00.000Z",
    "build_snapshot" : false,
    "lucene_version" : "9.8.0",
    "minimum_wire_compatibility_version" : "7.17.0",
    "minimum_index_compatibility_version" : "7.0.0"
  },
  "tagline" : "You Know, for Search"
}

配置参数详解

基础配置

bash

复制代码
docker run -d --name elasticsearch \
  -p 9200:9200 -p 9300:9300 \
  -e "discovery.type=single-node" \
  -e "ES_JAVA_OPTS=-Xms2g -Xmx2g" \
  -e "cluster.name=my-elasticsearch-cluster" \
  -e "node.name=node-1" \
  -e "network.host=0.0.0.0" \
  -e "http.cors.enabled=true" \
  -e "http.cors.allow-origin=*" \
  docker.elastic.co/elasticsearch/elasticsearch:8.11.0

环境变量说明

  • discovery.type=single-node:单节点模式

  • ES_JAVA_OPTS:JVM 内存设置

  • cluster.name:集群名称

  • node.name:节点名称

  • network.host:网络绑定地址

  • http.cors.enabled:跨域访问支持

数据持久化

使用数据卷

bash

复制代码
# 创建数据卷
docker volume create es-data

# 运行容器并挂载数据卷
docker run -d --name elasticsearch \
  -p 9200:9200 -p 9300:9300 \
  -e "discovery.type=single-node" \
  -e "xpack.security.enabled=false" \
  -v es-data:/usr/share/elasticsearch/data \
  docker.elastic.co/elasticsearch/elasticsearch:8.11.0

使用宿主机目录

bash

复制代码
# 创建本地目录
mkdir -p /docker/elasticsearch/{data,logs,config}

# 设置目录权限(重要!)
chmod -R 777 /docker/elasticsearch/

# 运行容器
docker run -d --name elasticsearch \
  -p 9200:9200 -p 9300:9300 \
  -e "discovery.type=single-node" \
  -e "xpack.security.enabled=false" \
  -v /docker/elasticsearch/data:/usr/share/elasticsearch/data \
  -v /docker/elasticsearch/logs:/usr/share/elasticsearch/logs \
  docker.elastic.co/elasticsearch/elasticsearch:8.11.0

使用自定义配置文件

创建配置文件

yaml

复制代码
# elasticsearch.yml
cluster.name: "docker-cluster"
network.host: 0.0.0.0

# 单节点配置
discovery.type: single-node

# 跨域配置
http.cors.enabled: true
http.cors.allow-origin: "*"

# 内存设置
bootstrap.memory_lock: false

# 安全配置(生产环境建议开启)
xpack.security.enabled: false

运行容器

bash

复制代码
docker run -d --name elasticsearch \
  -p 9200:9200 -p 9300:9300 \
  -v /docker/elasticsearch/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
  -v /docker/elasticsearch/data:/usr/share/elasticsearch/data \
  docker.elastic.co/elasticsearch/elasticsearch:8.11.0

集群部署

使用 Docker Compose

创建 docker-compose.yml 文件:

yaml

复制代码
version: '3.8'

services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0
    container_name: elasticsearch
    environment:
      - discovery.type=single-node
      - "ES_JAVA_OPTS=-Xms2g -Xmx2g"
      - cluster.name=docker-cluster
      - xpack.security.enabled=false
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - es-data:/usr/share/elasticsearch/data
      - ./elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
    ports:
      - "9200:9200"
      - "9300:9300"
    networks:
      - es-net

volumes:
  es-data:
    driver: local

networks:
  es-net:
    driver: bridge

启动集群服务

bash

复制代码
# 启动服务
docker-compose up -d

# 查看服务状态
docker-compose ps

# 查看日志
docker-compose logs -f elasticsearch

安全配置

启用安全功能

bash

复制代码
# 运行带有安全配置的容器
docker run -d --name elasticsearch \
  -p 9200:9200 -p 9300:9300 \
  -e "discovery.type=single-node" \
  -e "xpack.security.enabled=true" \
  -e "ELASTIC_PASSWORD=your_secure_password" \
  docker.elastic.co/elasticsearch/elasticsearch:8.11.0

使用安全连接

bash

复制代码
# 使用密码访问
curl -u elastic:your_secure_password "localhost:9200/"

# 或使用 API Key
curl -H "Authorization: ApiKey your_api_key" "localhost:9200/"

Kibana 集成

安装 Kibana

bash

复制代码
# 拉取 Kibana 镜像
docker pull docker.elastic.co/kibana/kibana:8.11.0

# 运行 Kibana
docker run -d --name kibana \
  -p 5601:5601 \
  -e "ELASTICSEARCH_HOSTS=http://elasticsearch:9200" \
  --link elasticsearch:elasticsearch \
  docker.elastic.co/kibana/kibana:8.11.0

完整的 Docker Compose 配置

yaml

复制代码
version: '3.8'

services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0
    container_name: elasticsearch
    environment:
      - discovery.type=single-node
      - "ES_JAVA_OPTS=-Xms1g -Xmx1g"
      - xpack.security.enabled=false
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - es-data:/usr/share/elasticsearch/data
    ports:
      - "9200:9200"
    networks:
      - elk-network

  kibana:
    image: docker.elastic.co/kibana/kibana:8.11.0
    container_name: kibana
    environment:
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
    ports:
      - "5601:5601"
    depends_on:
      - elasticsearch
    networks:
      - elk-network

volumes:
  es-data:
    driver: local

networks:
  elk-network:
    driver: bridge

常用操作

容器管理命令

bash

复制代码
# 启动容器
docker start elasticsearch

# 停止容器
docker stop elasticsearch

# 重启容器
docker restart elasticsearch

# 查看日志
docker logs -f elasticsearch

# 进入容器
docker exec -it elasticsearch /bin/bash

# 查看资源使用
docker stats elasticsearch

Elasticsearch 基本操作

bash

复制代码
# 检查集群健康状态
curl -X GET "localhost:9200/_cluster/health?pretty"

# 查看节点信息
curl -X GET "localhost:9200/_cat/nodes?v"

# 查看索引
curl -X GET "localhost:9200/_cat/indices?v"

# 创建索引
curl -X PUT "localhost:9200/my-index?pretty"

# 插入文档
curl -X POST "localhost:9200/my-index/_doc" \
  -H 'Content-Type: application/json' \
  -d '{
    "title": "测试文档",
    "content": "这是一个测试文档的内容",
    "timestamp": "2023-01-01"
  }'

# 搜索文档
curl -X GET "localhost:9200/my-index/_search?q=测试&pretty"

备份和恢复

bash

复制代码
# 创建快照仓库
curl -X PUT "localhost:9200/_snapshot/my_backup" \
  -H 'Content-Type: application/json' \
  -d '{
    "type": "fs",
    "settings": {
      "location": "/usr/share/elasticsearch/backups"
    }
  }'

# 创建快照
curl -X PUT "localhost:9200/_snapshot/my_backup/snapshot_1?wait_for_completion=true"

# 恢复快照
curl -X POST "localhost:9200/_snapshot/my_backup/snapshot_1/_restore"

性能优化

JVM 内存设置

bash

复制代码
docker run -d --name elasticsearch \
  -p 9200:9200 -p 9300:9300 \
  -e "discovery.type=single-node" \
  -e "ES_JAVA_OPTS=-Xms4g -Xmx4g" \
  -e "bootstrap.memory_lock=true" \
  --ulimit memlock=-1:-1 \
  docker.elastic.co/elasticsearch/elasticsearch:8.11.0

生产环境配置

yaml

复制代码
# elasticsearch.yml 生产配置
cluster.name: production-cluster
node.name: ${HOSTNAME}
network.host: 0.0.0.0
http.port: 9200

# 发现设置
discovery.seed_hosts: []
discovery.type: single-node

# 内存设置
bootstrap.memory_lock: true

# 网关设置
gateway.recover_after_nodes: 1

# 各种超时设置
action.destructive_requires_name: true

# 安全设置
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true

故障排查

常见问题解决

1. 内存不足

bash

复制代码
# 查看系统内存
free -h

# 调整 JVM 内存
-e "ES_JAVA_OPTS=-Xms2g -Xmx2g"

2. 权限问题

bash

复制代码
# 修复数据目录权限
chown -R 1000:1000 /docker/elasticsearch/data
chmod -R 755 /docker/elasticsearch/data

3. 启动失败

bash

复制代码
# 查看详细日志
docker logs elasticsearch

# 检查系统资源
docker system df
docker system prune  # 清理无用资源

4. 连接被拒绝

bash

复制代码
# 检查端口是否开放
netstat -tulpn | grep 9200

# 检查防火墙设置
sudo ufw status

健康检查

bash

复制代码
# 健康状态API
curl -X GET "localhost:9200/_cluster/health?pretty"

# 节点状态
curl -X GET "localhost:9200/_cat/health?v"

# 磁盘使用情况
curl -X GET "localhost:9200/_cat/allocation?v"

监控和维护

使用 Elasticsearch API 监控

bash

复制代码
# 集群状态
curl -s "localhost:9200/_cluster/stats?pretty" | jq .

# 节点状态
curl -s "localhost:9200/_nodes/stats?pretty" | jq .

# 索引状态
curl -s "localhost:9200/_stats?pretty" | jq .

定期维护任务

bash

复制代码
# 清理旧索引(保留最近30天)
curl -X DELETE "localhost:9200/logstash-$(date -d '30 days ago' +%Y.%m.%d)"

# 优化索引
curl -X POST "localhost:9200/my-index/_forcemerge?max_num_segments=1"

# 刷新索引
curl -X POST "localhost:9200/my-index/_refresh"

总结

通过 Docker 部署 Elasticsearch 提供了便捷的部署和管理方式。本文涵盖了从基础安装到生产环境配置的完整流程,包括:

  • ✅ 单节点和集群部署

  • ✅ 数据持久化配置

  • ✅ 安全设置

  • ✅ 性能优化

  • ✅ 监控维护

  • ✅ 故障排查

使用 Docker 部署 Elasticsearch 可以快速搭建搜索和分析平台,为应用程序提供强大的全文搜索能力。记得在生产环境中要特别注意安全配置、数据备份和性能监控。

相关推荐
筑梦之路3 小时前
docker ubuntu22.04更新报错问题——筑梦之路
运维·docker·容器
CodeHorizon3 小时前
Docker Buildx 构建多平台镜像的强大工具
其他·docker·容器·eureka
shan~~5 小时前
elasticsearch安装分词器和操作
大数据·elasticsearch·jenkins
秃了也弱了。5 小时前
elasticSearch之API:Ingest Pipeline & Painless Script
大数据·elasticsearch·jenkins
love530love6 小时前
【笔记】Podman Desktop 部署 开源数字人 HeyGem.ai
人工智能·windows·笔记·python·容器·开源·podman
Elasticsearch6 小时前
Elasticsearch 开放推理 API 增加了对 Google 的 Gemini 模型的支持
elasticsearch
dessler7 小时前
Elasticsearch(ES)Cerebro部署和使用
linux·运维·elasticsearch
weixin_436525077 小时前
Docker 镜像导出与导入教程(Windows - Linux)
运维·docker·容器
Deamon Tree7 小时前
ElasticSearch架构和写入、更新、删除、查询的底层逻辑
java·大数据·elasticsearch·架构