Docker 安装 Elasticsearch 7.17.6 完整教程

Elasticsearch 是目前最流行的分布式搜索引擎之一,在日志分析、全文检索、数据聚合等场景中广泛应用。本文将详细介绍如何使用 Docker 和 Docker Compose 快速部署 Elasticsearch 7.17.6 单节点实例,并配置中文分词器,帮助你在开发环境中快速搭建 ES 服务。


一、环境准备

1.1 系统要求

  • Linux 操作系统(本文以 CentOS 7/Ubuntu 20.04 为例)
  • 已安装 Docker 和 Docker Compose
  • 至少 2GB 可用内存
  • 服务器开放 9200、9300 端口

1.2 检查 Docker 环境

bash 复制代码
# 检查 Docker 版本
docker --version
检查 Docker Compose 版本
docker-compose --version
如果未安装,可参考官方文档进行安装

二、创建项目目录结构

2.1 建立主目录

bash 复制代码
# 创建主目录(可根据实际需求调整路径)
mkdir -p /root/my-project/elasticsearch
cd /root/my-project/elasticsearch

2.2 创建数据映射目录

bash 复制代码
# 创建数据、插件、配置目录
mkdir -p ./elasticsearch/data
mkdir -p ./elasticsearch/plugins
mkdir -p ./elasticsearch/config

2.3 目录结构说明

bash 复制代码
/root/my-project/elasticsearch/
├── docker-compose.yml          # Docker Compose 配置文件
└── elasticsearch/
    ├── data/                   # 数据存储目录(持久化)
    ├── plugins/                # 插件目录(如 IK 分词器)
    └── config/
        └── elasticsearch.yml   # ES 配置文件

三、编写 Docker Compose 文件

3.1 创建 docker-compose.yml

/root/my-project/elasticsearch/ 目录下创建 docker-compose.yml 文件:

yaml 复制代码
version: '3.8'
services:
elasticsearch:
image: elasticsearch:7.17.6
restart: always
hostname: es1
container_name: es-single
volumes:
- ./elasticsearch/data:/usr/share/elasticsearch/data
- ./elasticsearch/plugins:/usr/share/elasticsearch/plugins
- ./elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
environment:
- "ES_JAVA_OPTS=-Xms128m -Xmx128m"
- discovery.type=single-node
ports:
- '9200:9200'
- '9300:9300'
privileged: true
networks:
- es-network
networks:
es-network:
driver: bridge

3.2 配置参数说明

配置项 说明
image: elasticsearch:7.17.6 使用 Elasticsearch 7.17.6 官方镜像
restart: always 容器异常退出时自动重启
container_name: es-single 容器名称,便于管理
volumes 挂载数据、插件、配置文件到宿主机,实现持久化
ES_JAVA_OPTS=-Xms128m -Xmx128m JVM 堆内存设置(开发环境建议 128m~512m)
discovery.type=single-node 单节点模式启动
ports 映射 9200(HTTP API)和 9300(内部通信)端口
privileged: true 赋予容器特权模式,避免权限问题

四、配置 Elasticsearch

4.1 创建配置文件

/root/my-project/elasticsearch/elasticsearch/config/ 目录下创建 elasticsearch.yml

bash 复制代码
vim /root/my-project/elasticsearch/elasticsearch/config/elasticsearch.yml

4.2 写入以下配置

yaml 复制代码
# 集群名称
cluster.name: elasticsearch-cluster
节点名称
node.name: es-node-1
绑定 host,0.0.0.0 代表监听所有网络接口
network.host: 0.0.0.0
设置节点通信的 IP 地址(替换为你的服务器公网/内网 IP)
network.publish_host: 127.0.0.1
HTTP 服务端口
http.port: 9200
节点间 TCP 通信端口
transport.tcp.port: 9300
是否支持跨域(便于 Kibana 等工具访问)
http.cors.enabled: true
跨域允许的域名(生产环境建议限制具体域名)
http.cors.allow-origin: "*"
是否可作为主节点
node.master: true
是否可作为数据节点
node.data: true
单节点模式(注释掉集群发现配置)
discovery.seed_hosts: ["43.143.173.212:9300"]
cluster.initial_master_nodes: ["es-node-1"]
防止脑裂的最小节点数(单节点设置为 1)
discovery.zen.minimum_master_nodes: 1

4.3 配置说明

单节点模式注意事项

  • discovery.type=single-node 已在 docker-compose.yml 中设置,因此需要注释掉 discovery.seed_hostscluster.initial_master_nodes
  • network.publish_host 必须设置为服务器真实 IP,否则节点间通信可能失败

五、安装 IK 中文分词器

5.1 下载 IK 分词器

Elasticsearch 默认不支持中文分词,需安装 IK Analysis 插件。

bash 复制代码
# 进入插件目录
cd /root/my-project/elasticsearch/elasticsearch/plugins
下载对应 7.17.6 版本的 IK 分词器
wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.17.6/elasticsearch-analysis-ik-7.17.6.zip
解压到插件目录
unzip elasticsearch-analysis-ik-7.17.6.zip -d analysis-ik
删除 zip 包(可选)
rm -rf elasticsearch-analysis-ik-7.17.6.zip

注意

  • 插件版本必须与 ES 版本严格匹配(7.17.6)
  • 如果未安装 unzip,先执行:yum install -y unzipapt-get install -y unzip

5.2 验证插件安装

启动容器后,可通过以下命令验证:

bash 复制代码
# 查看已安装插件列表
docker exec -it es-single elasticsearch-plugin list

预期输出应包含:analysis-ik


六、启动 Elasticsearch

6.1 启动容器

bash 复制代码
# 在 docker-compose.yml 所在目录执行
docker-compose up -d elasticsearch

6.2 查看启动日志

bash 复制代码
# 查看容器日志
docker logs -f es-single
或使用 docker-compose
docker-compose logs -f elasticsearch

6.3 验证服务是否正常

bash 复制代码
# 访问 ES API
curl -X GET "http://localhost:9200"
或通过服务器 IP 访问(替换为实际 IP)
curl -X GET "http://43.143.173.212:9200"

正常响应示例:

json 复制代码
{
  "name" : "es-node-1",
  "cluster_name" : "elasticsearch-cluster",
  "cluster_uuid" : "xxx",
  "version" : {
    "number" : "7.17.6",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "xxx",
    "build_date" : "2022-08-23T18:12:59.188061045Z",
    "build_snapshot" : false,
    "lucene_version" : "8.11.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

七、常见问题排查

7.1 权限异常:AccessDeniedException

现象 :启动日志中出现 java.nio.file.AccessDeniedException: /usr/share/elasticsearch/data/nodes

原因:容器内用户(UID 1000)对挂载的 data 目录没有写入权限

解决方案

bash 复制代码
# 方法一:赋予目录 777 权限
chmod -R 777 /root/my-project/elasticsearch/elasticsearch/data
方法二:修改目录所有者为 1000(推荐)
chown -R 1000:1000 /root/my-project/elasticsearch/elasticsearch/data
重启容器
docker-compose restart elasticsearch

7.2 内存不足问题

现象:容器启动后很快退出,日志显示内存分配失败

解决方案

bash 复制代码
# 方法一:在 docker-compose.yml 中调小 JVM 内存
environment:
  - "ES_JAVA_OPTS=-Xms64m -Xmx64m"
方法二:修改系统 vm.max_map_count
sysctl -w vm.max_map_count=262144
echo "vm.max_map_count=262144" >> /etc/sysctl.conf

7.3 端口占用问题

现象Bind for 0.0.0.0:9200 failed: port is already allocated

解决方案

bash 复制代码
# 查看占用端口的进程
netstat -tunlp | grep 9200
lsof -i:9200
修改 docker-compose.yml 中的映射端口
ports:
'9201:9200'  # 改为其他端口

7.4 IK 分词器未生效

现象:安装 IK 后,分词测试仍返回单字分词

解决方案

bash 复制代码
# 重启容器使插件生效
docker-compose restart elasticsearch
测试 IK 分词
curl -X POST "http://localhost:9200/_analyze" -H "Content-Type: application/json" -d '{
"analyzer": "ik_max_word",
"text": "中华人民共和国"
}'

八、Elasticsearch 常用命令

8.1 容器管理命令

bash 复制代码
# 启动容器
docker-compose up -d elasticsearch
停止容器
docker-compose stop elasticsearch
重启容器
docker-compose restart elasticsearch
查看容器状态
docker-compose ps
进入容器内部
docker exec -it es-single /bin/bash
删除容器(数据卷会保留)
docker-compose down

8.2 ES API 操作

bash 复制代码
# 查看集群健康状态
curl -X GET "http://localhost:9200/_cluster/health?pretty"
查看节点信息
curl -X GET "http://localhost:9200/_nodes?pretty"
查看所有索引
curl -X GET "http://localhost:9200/_cat/indices?v"
创建索引
curl -X PUT "http://localhost:9200/test_index"
删除索引
curl -X DELETE "http://localhost:9200/test_index"

九、Kibana 可视化配置(可选)

如果需要使用 Kibana 进行数据可视化,可以添加以下服务到 docker-compose.yml

yaml 复制代码
kibana:
  image: kibana:7.17.6
  container_name: kibana
  restart: always
  ports:
    - '5601:5601'
  environment:
    - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
  depends_on:
    - elasticsearch
  networks:
    - es-network

启动 Kibana:

bash 复制代码
docker-compose up -d kibana

访问 http://43.143.173.212:5601 即可进入 Kibana 控制台。


十、生产环境建议

10.1 安全性配置

yaml 复制代码
# 启用 X-Pack 安全认证
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
设置密码(需通过 elasticsearch-setup-passwords 工具配置)

10.2 资源限制

yaml 复制代码
# docker-compose.yml 中添加资源限制
services:
  elasticsearch:
    deploy:
      resources:
        limits:
          memory: 2G
          cpus: '2'
        reservations:
          memory: 1G

10.3 集群模式

生产环境建议部署 3 个以上节点的集群:

  • 至少 3 个主节点(防止脑裂)
  • 数据节点与主节点分离
  • 配置专用协调节点

结语

通过本文的步骤,你应该已经成功在 Docker 环境中部署了 Elasticsearch 7.17.6,并配置了中文分词器。这个单节点环境非常适合开发测试和中小规模项目使用。

相关推荐
名字还没想好☜2 小时前
Kubernetes Pod 调度实战:nodeSelector、亲和性与 taint/toleration 把 Pod 放到指定节点
运维·云原生·容器·kubernetes·调度
念何架构之路2 小时前
moby-BuildKit(builder-next)
学习·docker·容器
风曦Kisaki2 小时前
Kubernetes(K8s)笔记Day04:控制器(ReplicaSet 与Deployment),滚动更新及回滚,滚动更新策略,Pod 的 DNS 策略
linux·运维·笔记·docker·容器·kubernetes
张忠琳2 小时前
【NVIDIA】k8s-device-plugin v0.19.3 辅助命令模块深度分析之七
云原生·容器·架构·kubernetes·nvidia
爱码少年2 小时前
此docker compose非彼docker-compose
docker
January丶2 小时前
docker-compose部署RabbitMQ(含管理页面)
docker
January丶2 小时前
docker-compose部署ElasticSearch集群
docker
johnny2332 小时前
镜像管理工具Skopeo实战
docker
Tattoo_Welkin3 小时前
IDEA 中常用操作记载
java·elasticsearch·intellij-idea