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