百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

【Docker】Elasticsearch 8.12 安装与搭建

liuian 2025-09-18 22:48 1 浏览

由于工作过程中硬件资源未能达到要求,现将使用 Elasticsearch 取代原 Redis + MySQL + Milvus 技术栈,在重新搭建的同时记录一下搭建过程(由于之前也分享过 Docker 版本 Elasticsearch 5.x 和 Elasticsearch 7.x 的部署方法,因此本文对分享过的内容将不再重复说明)。

1. 应用部署

虽然最终没有使用 8.14.2 版本,但考虑到实际部署跟这个过程也是大差不差的,因此这段内容还是保留吧。

第一步,先将 Elasticsearch 容器启动起来,如下图:

docker run -d -p 9200:9200 -p 9300:9300 elasticsearch:8.14.2

启动起来后可以进入容器内部将 config、data、plugins 三个目录下载到宿主机(这里为了方便使用了 Docker Desktop 来操作,在命令行下要使用 docker cp 命令进行操作),如下图:

目录下载后结构如下图所示:

如上图所示, elasticsearch.yml 和 jvm.options 可以按需进行修改(配置内容在之前文章已经说明,这里不再细说)。接着挂载目录就可以启动 Elasticsearch 容器,全部命令如下图:

docker run -d \
  --privileged=true \
  --name es_vct \
  --network elknetwork \
  -p 9200:9200 \
  -p 9300:9300 \
  -v ${docker_path}/elasitcsearch8/data:/usr/share/elasticsearch/data \
  -v ${docker_path}/elasitcsearch8/plugins:/usr/share/elasticsearch/plugins \
  -v ${docker_path}/elasitcsearch8/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
  --restart=always \
  elasticsearch:8.14.2

但是... OSX 系统在启动后会报以下错误,如下图:

2024-08-06 09:46:51 {"@timestamp":"2024-08-06T01:46:51.542Z", "log.level":"ERROR", "message":"fatal exception while booting Elasticsearch", "ecs.version": "1.2.0","service.name":"ES_ECS","event.dataset":"elasticsearch.server","process.thread.name":"main","log.logger":"org.elasticsearch.bootstrap.Elasticsearch","elasticsearch.node.name":"ff06f045201e","elasticsearch.cluster.name":"elastic_vector","error.type":"java.lang.IllegalStateException","error.message":"Plugin [.DS_Store] is missing a descriptor properties file.","error.stack_trace":"java.lang.IllegalStateException: Plugin [.DS_Store] is missing a descriptor properties file.\n\tat org.elasticsearch.server@8.14.2/org.elasticsearch.plugins.PluginDescriptor.readFromProperties(PluginDescriptor.java:233)\n\tat org.elasticsearch.server@8.14.2/org.elasticsearch.plugins.PluginsUtils.readPluginBundle(PluginsUtils.java:255)\n\tat org.elasticsearch.server@8.14.2/org.elasticsearch.plugins.PluginsUtils.findBundles(PluginsUtils.java:236)\n\tat org.elasticsearch.server@8.14.2/org.elasticsearch.plugins.PluginsUtils.getPluginBundles(PluginsUtils.java:218)\n\tat org.elasticsearch.server@8.14.2/org.elasticsearch.plugins.PluginsService.<init>(PluginsService.java:156)\n\tat org.elasticsearch.server@8.14.2/org.elasticsearch.node.NodeServiceProvider.newPluginService(NodeServiceProvider.java:54)\n\tat org.elasticsearch.server@8.14.2/org.elasticsearch.node.NodeConstruction.createEnvironment(NodeConstruction.java:451)\n\tat org.elasticsearch.server@8.14.2/org.elasticsearch.node.NodeConstruction.prepareConstruction(NodeConstruction.java:252)\n\tat org.elasticsearch.server@8.14.2/org.elasticsearch.node.Node.<init>(Node.java:192)\n\tat org.elasticsearch.server@8.14.2/org.elasticsearch.bootstrap.Elasticsearch$2.<init>(Elasticsearch.java:240)\n\tat org.elasticsearch.server@8.14.2/org.elasticsearch.bootstrap.Elasticsearch.initPhase3(Elasticsearch.java:240)\n\tat org.elasticsearch.server@8.14.2/org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:75)\n"}
2024-08-06 09:46:51 ERROR: Elasticsearch did not exit normally - check the logs at /usr/share/elasticsearch/logs/elastic_vector.log

在 github 找到了这个错误的解释,如下图:

(吐槽一下:问题是 2022 年发现的,但 2024 年还没有修复...)

我们按上述方法执行一下删除命令即可消除错误信息,如下图:

rm ${docker_path}/elasitcsearch8/plugins/.DS_Store

接着第二个问题又来了,Elasticsearch 启动到时出现卡顿,如下图:

2024-08-06 10:15:36 Aug 06, 2024 2:15:36 AM sun.util.locale.provider.LocaleProviderAdapter <clinit>
2024-08-06 10:15:36 WARNING: COMPAT locale provider will be removed in a future release
2024-08-06 10:15:36 {"@timestamp":"2024-08-06T02:15:36.723Z", "log.level": "INFO", "message":"Using [jdk] native provider and native methods for [Linux]", "ecs.version": "1.2.0","service.name":"ES_ECS","event.dataset":"elasticsearch.server","process.thread.name":"main","log.logger":"org.elasticsearch.nativeaccess.NativeAccess","elasticsearch.node.name":"86f65a8da329","elasticsearch.cluster.name":"docker-cluster"}
2024-08-06 10:15:37 {"@timestamp":"2024-08-06T02:15:37.123Z", "log.level": "INFO", "message":"Java vector incubator API enabled; uses preferredBitSize=512; FMA enabled", "ecs.version": "1.2.0","service.name":"ES_ECS","event.dataset":"elasticsearch.server","process.thread.name":"main","log.logger":"org.apache.lucene.internal.vectorization.PanamaVectorizationProvider","elasticsearch.node.name":"86f65a8da329","elasticsearch.cluster.name":"docker-cluster"}

这种“假死”情况大几率是因为配置出现问题了,重新审视一遍配置文件得知, discovery.type 并未正常配置(由于是单体服务,这里需要通过 single-node 进行表示)。

将配置加上后就可以正常启动了。

2. 8.12 版本部署并安装分词(ik)插件

启动成功后添加分词插件,到 github 仓库中找到最新的 release ,如下图:

尝试安装 8.4.1 版本后发现与目前 Elasticsearch 版本不匹配。出现以下报错:

java.lang.IllegalStateException: Plugin [ik] is missing a descriptor properties file

最后实在弄得有点儿烦了就选择了 8.12.2 版本的分词插件,而 Elasticsearch 也降级到 8.12.2 版本。

PS:这里其实我也是不太确定的,尝试了很多次还是安装不上才选择了降级。或许是当时配置也有点错误吧,8.12.2 版本能用我就没有再深究这个问题了。

8.12.2 版本部署过程其实跟 8.14.2 一致(没什么好说的)。接下来只需将分词插件放对位置就能够实现安装,如下图:

在分词插件的 github release 网页中点击打开 8.12.2 的 Assets 折叠区,并选择下载
elasticsearch-analysis-ik-8.12.2.zip 压缩包。下载完成后将其放到 ${docker_path}/elasitcsearch8/plugins 目录下并解压。解压后重命名文件夹为 analysis-ik 并删除 zip 压缩包。之后重启 Elasticsearch 容器 ik 分词插件就会自动安装,最终启动命令如下:

docker run -d \
  --privileged=true \
  --name elasticsearch8 \
  -p 9200:9200 \
  -p 9300:9300 \
  -v ${docker_path}/elasitcsearch8/data:/usr/share/elasticsearch/data \
  -v ${docker_path}/elasitcsearch8/plugins:/usr/share/elasticsearch/plugins \
  -v ${docker_path}/elasitcsearch8/config:/usr/share/elasticsearch/config \
  -v ${docker_path}/elasitcsearch8/logs:/usr/share/elasticsearch/logs \
  -v /etc/localtime:/etc/localtime \
  -e TZ="Asia/Shanghai" \
  -e LANG="C.UTF-8" \
  --restart=always \
  elasticsearch:8.12.2

那么如何验证分词插件安装成功呢?

这时我在 Firefox 浏览器中安装一个 Elasticvue 插件(这个插件还挺好用),对 Elasticsearch 服务提交 REST 分词请求,如下图:

看到上面的输出就证明分词器安装成功。

3. 安装 x-pack 安全插件

这个在之前博客中已经详细说明过一次,在这里我再补充说明一下(主要是跟之前不一样的部分)。

第一步开启 xpack.security 服务,如下图:

注意, xpack 的其他服务都是 false(关闭)状态的,只有 xpack.security.enabled 是 true(开启)状态,不然启动时会报错。之后重启 Elasticsearch 容器,并进入 CLI 控制台先创建 keystore,如下图:

sh-5.0$ ./bin/elasticsearch-keystore create
An elasticsearch keystore already exists. Overwrite? [y/N]y
Created elasticsearch keystore in /usr/share/elasticsearch/config/elasticsearch.keystore

keystore 创建完成后就可以针对“elastic”用户进行 password 重置了,如下图:

sh-5.0$ elasticsearch-reset-password -i -u elastic
This tool will reset the password of the [elastic] user.
You will be prompted to enter the password.
Please confirm that you would like to 

continue [y/N]y

Enter password for [elastic]: 
Re-enter password for [elastic]: 
Password for the [elastic] user successfully reset.

这里可以通过
elasticsearch-reset-password
直接对指定用户进行密码重置(跟之前不同的地方)。

再之后就可以创建 ca 证书了,如下图:

sh-5.0$ ./bin/elasticsearch-certutil ca
...

Please enter the desired output file [elastic-stack-ca.p12]: config/certs/elastic-stack-ca.p12
Enter password for elastic-stack-ca.p12 : 

再之后就可以使用 ca 证书创建密钥,如下图:

sh-5.0$ ./bin/elasticsearch-certutil cert --ca config/certs/elastic-stack-ca.p12
...

Enter password for CA (config/certs/elastic-stack-ca.p12) : 
Please enter the desired output file [elastic-certificates.p12]: config/certs/elastic-certificates.p12
Enter password for elastic-certificates.p12 : 

...

For client applications, you may only need to copy the CA certificate and
configure the client to trust this certificate.

注意,这里的 ca 证书和密钥的 output 目录都是指向 config/certs 。之所以要指向这个目录是因为它已经挂载到宿主机了。万一这个容器被干掉了,还可以直接用回 ca 证书重新生成密钥。

sh-5.0$ ./bin/elasticsearch-keystore add \
> xpack.security.transport.ssl.keystore.secure_password
Enter value for xpack.security.transport.ssl.keystore.secure_password:
sh-5.0$ ./bin/elasticsearch-keystore add \
> xpack.security.transport.ssl.truststore.secure_password
Enter value for xpack.security.transport.ssl.truststore.secure_password: 

最后创建安全连接的密码。

好了,密钥都创建完成了。现在只需在 elasticsearch.yml 开放所有安全校验即可,如下图:

将 transport.ssl 开启并指派密钥的地址(容器内地址),就可以重新启动 Elasticsearch 容器了。

最后使用 Elasticvue 进行测试,看到以上的输出就证明配置成功了。

相关推荐

eino v0.4.5版本深度解析:接口类型处理优化与错误机制全面升级

近日,eino框架发布了v0.4.5版本,该版本在错误处理、类型安全、流处理机制以及代理配置注释等方面进行了多项优化与修复。本次更新共包含6个提交,涉及10个文件的修改,由2位贡献者共同完成。本文将详...

SpringBoot异常处理_springboot异常注解

在SpringBoot中,异常处理是构建健壮、可维护Web应用的关键部分。良好的异常处理机制可以统一返回格式、提升用户体验、便于调试和监控。以下是SpringBoot中处理异常的完整指...

Jenkins运维之路(Jenkins流水线改造Day02-1-容器项目)

这回对线上容器服务器的流水线进行了一定的改造来满足目前线上的需求,还是会将所有的自动化脚本都放置到代码库中统一管理,我感觉一章不一定写的完,所以先给标题加了个-1,话不多说开干1.本次流水线的流程设计...

告别宕机!零基础搭建服务器监控告警系统!小白也能学会!

前言本文将带你从零开始,一步步搭建一个完整的服务器指标监控与邮件告警系统,使用的技术栈均为业界主流、稳定可靠的开源工具:Prometheus:云原生时代的监控王者,擅长指标采集与告警规则定义Node_...

httprunner实战接口测试笔记,拿走不谢

每天进步一点点,关注我们哦,每天分享测试技术文章本文章出自【码同学软件测试】码同学公众号:自动化软件测试码同学抖音号:小码哥聊软件测试01开始安装跟创建项目pipinstallhttprunne...

基于JMeter的性能压测平台实现_jmeter压测方案

这篇文章已经是两年前写的,短短两年时间,JMeter开源应用技术的发展已经是翻天覆地,最初由github开源项目zyanycall/stressTestPlatform形成的这款测试工具也开始慢...

12K+ Star!新一代的开源持续测试工具!

大家好,我是Java陈序员。在企业软件研发的持续交付流程中,测试环节往往是影响效率的关键瓶颈,用例管理混乱、接口调试复杂、团队协作不畅、与DevOps流程脱节等问题都能影响软件交付。今天,给大家...

Spring Boot3 中分库分表之后如何合并查询

在当今互联网应用飞速发展的时代,数据量呈爆发式增长。对于互联网软件开发人员而言,如何高效管理和查询海量数据成为了一项关键挑战。分库分表技术应运而生,它能有效缓解单库单表数据量过大带来的性能瓶颈。而在...

离线在docker镜像方式部署ragflow0.17.2

经常项目上会出现不能连外网的情况,要怎么使用ragflow镜像部署呢,这里提供详细的步骤。1、下载基础镜像根据docker-compose-base.yml及docker-compose.yml中的i...

看,教你手写一个最简单的SpringBoot Starter

何为Starter?想必大家都使用过SpringBoot,在SpringBoot项目中,使用最多的无非就是各种各样的Starter了。那何为Starter呢?你可以理解为一个可拔插式...

《群星stellaris》军事基地跳出怎么办?解决方法一览

《群星stellaris》军事基地跳出情况有些小伙伴出现过这种情况,究竟该怎么解决呢?玩家“gmjdadk”分享的自己的解决方法,看看能不能解决。我用英文原版、德语、法语和俄语四个版本对比了一下,结果...

数据开发工具dbt手拉手教程-03.定义数据源模型

本章节介绍在dbt项目中,如何定义数据源模型。定义并引入数据源通过Extract和Load方式加载到仓库中的数据,可以使用dbt中的sources组件进行定义和描述。通过在dbt中将这些数据集(表)声...

docker compose 常用命令手册_docker-compose init

以下是DockerCompose常用命令手册,按生命周期管理、服务运维、构建配置、扩缩容、调试工具分类,附带参数解析、示例和关键说明,覆盖多容器编排核心场景:一、生命周期管理(核心命令...

RagFlow与DeepSeek R1本地知识库搭建详细步骤及代码实现

一、环境准备硬件要求独立显卡(建议NVIDIAGPU,8GB显存以上)内存16GB以上,推荐32GB(处理大规模文档时更高效)SSD硬盘(加速文档解析与检索)软件安装bash#必装组件Docker...

Docker Compose 配置更新指南_docker-compose配置

高效管理容器配置变更的最佳实践方法重启范围保留数据卷适用场景docker-composeup-d变更的服务常规配置更新--force-recreate指定/所有服务强制重建down→up流程...