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_hosts和cluster.initial_master_nodesnetwork.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 unzip或apt-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,并配置了中文分词器。这个单节点环境非常适合开发测试和中小规模项目使用。