Elasticsearch:如何在 Docker 上运行 Elasticsearch 8.x 进行本地开发

news2025/1/18 8:50:00

对于 Elasticsearch 的新主要版本 (8.x.x),有关于在 Docker 上运行 Elasticsearch 和 Kibana 的重大更新。 过去适用于以前版本的 Docker 和 Docker Compose 的命令和语法需要更新才能适用于最新版本。 在这篇文章中,我们将介绍如何使用 Docker 和 Docker Compose 启动 Elasticsearch(8.6.0 版本)和 Kibana 进行本地开发。

我在之前的如下的文章中也对这个有所描述,但是在今天的文章中,我将从另外一个视角来进行展示。我将展示如何安装不带安全的 Elasticsearch。这个在很多的情况下也是适用的。

  • Elastic:使用 docker 来安装 Elastic Stack 8.0

  • Elasticsearch:使用 Docker compose 来一键部署 Elastic Stack 8.x

在我的展示中,我将使用最新的 Elastic Stack 8.6.0 来进行展示。

在禁用 xpack 安全性的情况下在 Docker 上运行 Elasticsearch 和 Kibana

默认情况下启用 xpack 安全性,这意味着你需要身份验证才能访问 Elasticsearch 服务器。 但是,对于本地开发,我们通常不需要很高的安全级别,因为一切都在本地。 我们将更多地关注业务逻辑和代码,而不是基础设施。 当代码准备好用于生产时。 我们可以使用托管的 Elasticsearch 解决方案,例如开发和维护 Elasticsearch 的公司 elastic.co。

直接用 Docker 启动 Elasticsearch 和 Kibana 非常简单。 首先,我们需要创建一个供 Elasticsearch 和 Kibana 使用的 network。这个 network 将被用于 Elasticsearch 和 Kibana 之间的通信。

docker network create elastic
$ docker network create elastic
74c71b18b8f1a411e76ba9e99fea31d858301bc6b861d5fe795afac53b00fdce

然后我们可以为 Elasticsearch 创建一个 Docker 容器:

docker run \
      --name elasticsearch \
      --net elastic \
      -p 9200:9200 \
      -e discovery.type=single-node \
      -e ES_JAVA_OPTS="-Xms1g -Xmx1g"\
      -e xpack.security.enabled=false \
      -it \
      docker.elastic.co/elasticsearch/elasticsearch:8.6.0

 这里的要点

  • 刚刚创建的网络用于 Elasticsearch,因此它可以被 Kibana 发现,Kibana 也将使用该网络。
  • 创建单节点 Elasticsearch 集群。
  • 环境变量 ES_JAVA_OPTS 用于指定最小和最大 JVM 堆大小(在本例中为 1GB)。 如果没有设置,很有可能你的 Elasticsearch 容器无法启动成功。
  • 我们需要明确禁用 xpack 安全性,这样我们就不需要身份验证来访问 Elasticsearch 服务器。 本地开发没问题,但应该为生产启用。

我们可以使用 Dockerhub 上托管的 docker 镜像,也可以使用 Elasticsearch 直接提供的镜像。

运行完上面的命令后,我们可以使用如下的命令来查看正在运行的 docker 容器:

docker ps
$ docker ps
CONTAINER ID   IMAGE                                                 COMMAND                  CREATED              STATUS              PORTS                              NAMES
5418c3eb7e96   docker.elastic.co/elasticsearch/elasticsearch:8.6.0   "/bin/tini -- /usr/l…"   About a minute ago   Up About a minute   0.0.0.0:9200->9200/tcp, 9300/tcp   elasticsearch

我们在 macOS 上可以使用如下的命令来查看 9200 是否已经被使用:

sudo lsof -i -P | grep LISTEN | grep 9200
$ sudo lsof -i -P | grep LISTEN | grep 9200
Password:
com.docke 55204          liuxg  133u  IPv6 0xec85ab355a7a51d      0t0    TCP *:9200 (LISTEN)

我们在 terminal 中可以打入如下的命令来进行查看:

curl localhost:9200
$ curl localhost:9200
{
  "name" : "5418c3eb7e96",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "8T2kPKBCQ_Ck03Xli0GHVw",
  "version" : {
    "number" : "8.6.0",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "f67ef2df40237445caa70e2fef79471cc608d70d",
    "build_date" : "2023-01-04T09:35:21.782467981Z",
    "build_snapshot" : false,
    "lucene_version" : "9.4.2",
    "minimum_wire_compatibility_version" : "7.17.0",
    "minimum_index_compatibility_version" : "7.0.0"
  },
  "tagline" : "You Know, for Search"
}

上面表明我们的 Elasticsearch 已经成功地运行起来了。当你看到上面的输出时,表示 Elasticsearch Docker 容器已成功启动。

然后我们可以启动一个 Kibana 容器来管理带有漂亮用户界面的 Elasticsearch 服务器。要为 Kibana 启动 Docker 容器,请在另外一个 terminal 中运行:

docker run \
    --name kibana \
    --net elastic \
    -p 5601:5601 \
    docker.elastic.co/kibana/kibana:8.6.0

这里的重点是:

  • 我们必须为 Kibana 指定与 Elasticsearch 相同的网络。
  • 最好使用与 Elasticsearch 相同版本的 Kibana。

如果访问 http://localhost:5601,就可以直接打开 Kibana 的Web UI,不需要认证。

我们可以使用如下的命令来查看正在运行的容器:

docker ps
$ docker ps
CONTAINER ID   IMAGE                                                 COMMAND                  CREATED          STATUS          PORTS                              NAMES
6a4a6b1f8fbf   docker.elastic.co/kibana/kibana:8.6.0                 "/bin/tini -- /usr/l…"   3 minutes ago    Up 3 minutes    0.0.0.0:5601->5601/tcp             kibana
5418c3eb7e96   docker.elastic.co/elasticsearch/elasticsearch:8.6.0   "/bin/tini -- /usr/l…"   15 minutes ago   Up 15 minutes   0.0.0.0:9200->9200/tcp, 9300/tcp   elasticsearch

使用 Docker Compose 运行 Elasticsearch 和 Kibana

最好在 docker-compose.yaml 文件中指定我们需要运行的 Docker 容器,尤其是当你有多个容器时。 这样,你可以同时管理它们,而不需要一个一个地启动它们。 有了docker-compose.yaml,代码的版本控制和共享也更加方便。

上面演示的 Elasticsearch 和 Kibana 容器的 docker-compose.yaml 文件如下。 设置与直接启动 Docker 容器相同。我们先使用 CTRL+C 来停止上面运行的容器。我们创建如下的 docker-compose.yml 文件:

docker-compose.yml

version: "3.9"
services:
  elasticsearch:
    image: elasticsearch:8.6.0
    environment:
      - discovery.type=single-node
      - ES_JAVA_OPTS=-Xms1g -Xmx1g
      - xpack.security.enabled=false
    volumes:
      - es_data:/usr/share/elasticsearch/data
    ports:
      - target: 9200
        published: 9200
    networks:
      - elastic

  kibana:
    image: kibana:8.6.0
    ports:
      - target: 5601
        published: 5601
    depends_on:
      - elasticsearch
    networks:
      - elastic      

volumes:
  es_data:
    driver: local

networks:
  elastic:
    name: elastic
    driver: bridge

可以看到,我们可以在同一个文件中管理网络、volume 和容器,超级方便。 请记住在使用此 docker-compose.yaml 文件启动容器/服务之前关闭上面启动的 elasticsearch 和 kibana 容器,否则会发生端口冲突。 或者,你可以在此文件中指定不同的已发布端口。我们使用如下的命令来启动:

docker-compose up

等 Elasticsearch 及 Kibana 容器起来后,我们就可以访问它们了。当我们完成上面的运行并不再使用这些容器的话,请使用如下的命令来删除使用的资源:

docker-compose down

在启用 xpack 安全性的 Docker 上运行 Elasticsearch 和 Kibana

上面我们介绍了如何快速启动 Elasticsearch 和 Kibana 的 Docker 容器进行本地开发。 当不需要担心身份验证问题时,它们非常适合本地开发。

对于生产,我们当然应该启用 xpack 安全功能。 但是,如果可能的话,我们不应该自己托管 Elasticsearch 服务器,而应该通过专门的提供商来托管,例如开发和维护 Elasticsearch 的公司 elastic.co。 这样,我们就不用担心硬件、安全、升级等细节问题,可以专注于业务逻辑和数据。

然而,在某些情况下也需要本地身份验证。 我们可以删除上面演示的 xpack.security.enabled=false 环境变量,xpack 安全将自动启用。我们先创 elastic 这个网络:

docker network create elastic

如果网络已经存在,你可以不创建。

要启动启用了 xpack 安全性的 Elasticsearch 容器,请运行:

docker run \
      --name elasticsearch \
      --net elastic \
      -p 9200:9200 \
      -e discovery.type=single-node \
      -e ES_JAVA_OPTS="-Xms1g -Xmx1g"\
      -e ELASTIC_PASSWORD=elastic \
      -it \
      docker.elastic.co/elasticsearch/elasticsearch:8.6.0

如果你已经做了上面的练习,那么你可能会遇到如下的错误信息:

$ docker run \
>       --name elasticsearch \
>       --net elastic \
>       -p 9200:9200 \
>       -e discovery.type=single-node \
>       -e ES_JAVA_OPTS="-Xms1g -Xmx1g"\
>       -e ELASTIC_PASSWORD=elastic \
>       -it \
>       docker.elastic.co/elasticsearch/elasticsearch:8.6.0
docker: Error response from daemon: Conflict. The container name "/elasticsearch" is already in use by container "5418c3eb7e964993215c3162571e6cbe3dc969b68ced0cf5ff0529d9a93fb7ff". You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'.

这是因为 elasticsearch 这个名字已经被使用。我们可以通过如下的方法来删除它:

$ docker ps -a
CONTAINER ID   IMAGE                                                 COMMAND                  CREATED          STATUS                       PORTS     NAMES
6a4a6b1f8fbf   docker.elastic.co/kibana/kibana:8.6.0                 "/bin/tini -- /usr/l…"   15 minutes ago   Exited (0) 7 minutes ago               kibana
5418c3eb7e96   docker.elastic.co/elasticsearch/elasticsearch:8.6.0   "/bin/tini -- /usr/l…"   27 minutes ago   Exited (130) 7 minutes ago             elasticsearch
$ docker container rm elasticsearch
elasticsearch
$ docker container rm kibana
kibana

这样,我们删除了上面的两个容器:elasticsearch 及 kibana。我们再次运行上面的命令:

请注意,我们为默认用户 elastic 指定了密码。 如果此处不指定,则在启动容器时会生成一个随机密码。 你还将看到为 Kibana 生成的注册 token:

 我们向下滚动,我们可以看到:

打开一个新的控制台,我们先直接调用 Elasticsearch API。 奇怪的是,我们需要从 Docker 容器中复制安全证书并将其用于 curl 身份验证:

docker cp elasticsearch:/usr/share/elasticsearch/config/certs/http_ca.crt .
$ docker cp elasticsearch:/usr/share/elasticsearch/config/certs/http_ca.crt .
$ ls
docker-compose.yml http_ca.crt

我们在上面的目录中使用如下的命令:

curl --cacert http_ca.crt https://elastic:elastic@localhost:9200
$ curl --cacert http_ca.crt https://elastic:elastic@localhost:9200
{
  "name" : "0d00368e6884",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "_do0yq5LQt-puX4feF8cBQ",
  "version" : {
    "number" : "8.6.0",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "f67ef2df40237445caa70e2fef79471cc608d70d",
    "build_date" : "2023-01-04T09:35:21.782467981Z",
    "build_snapshot" : false,
    "lucene_version" : "9.4.2",
    "minimum_wire_compatibility_version" : "7.17.0",
    "minimum_index_compatibility_version" : "7.0.0"
  },
  "tagline" : "You Know, for Search"
}

然后让我们创建一个 Kibana 容器来管理这个带有身份验证的 Elasticsearch 服务器。 该命令实际上与上面相同:

docker run \
    --name kibana \
    --net elastic \
    -p 5601:5601 \
    docker.elastic.co/kibana/kibana:8.6.0

在控制台中,我们看到类似这样的内容:

注意:我们需要在 URL 中指定验证码才能访问 Kibana。 0.0.0.0 表示本地计算机上的所有 IPv4 地址都可以访问此端口。 当你转到 http://0.0.0.0:5601/?code=828696 时,系统会提示你输入注册 token: 

 复制并粘贴启动 Elasticsearch 容器时屏幕上显示的注册 token。 如果屏幕上满是日志或令牌已过期,你可以使用 elasticsearch-create-enrollment-token 命令生成一个新 token。 我们可以直接在 Elasticsearch 容器内使用 elasticsearch-create-enrollment-token 命令:

$ docker exec -it elasticsearch \
    /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token \
    -s kibana

然后在你点击 “Configure Elastic” 之后,你需要输入你的用户名和密码,在这个例子中都 elastic。最后,你可以使用 Kibana 来管理你的 Elasticsearch 服务器。 嗯,启用 xpack 安全性确实非常安全。 我们需要验证码、注册 token 和用户名/密码,这将确保安全🛡️。 

启用 xpack 安全性时使用 Docker Compose 运行 Elasticsearch 和 Kibana 

令人惊讶的是,在启用 xpack 安全性的情况下,编写 docker-compose.yaml 文件来管理 Elasticsearch 和 Kibana 容器非常复杂。 我们需要自己明确管理证书,可以在 “Elasticsearch:使用 Docker compose 来一键部署 Elastic Stack 8.x” 中找到。 很奇怪,直接使用 Docker 如此简单,而使用 Docker Compose 对于 xpack 安全性却复杂得多。 我认为在他们有更好的版本之前,我们应该避免使用它。

总结

我们已经介绍了在 Docker 上运行 Elasticsearch 和 Kibana 的各种方法。 对于本地开发,在大多数情况下我们可以禁用 xpack 安全性,只关注数据和查询。 在禁用 xpack 安全性时使用 Docker 会更加直接。 对于生产,我们通常会将数据托管在专门的提供商(例如 elastic.co)上,这样可以省去管理服务器、证券和升级的工作,让我们专注于重要的业务逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/158576.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Hudi系列5:Hudi与Spark集成

文章目录一. Spark操作Huid概述二. Spark-Shell方式三. pyspark方式四. SparkSQL方式参考:一. Spark操作Huid概述 Hudi各个版本支持Spark版本情况: 将hudi集成spark的jar包,放到spark的jars目录 -- 同步到其它节点 cd /home/hudi-0.12.0/packaging/hudi-spark-b…

【设计模式】UML类图

设计模式学习之旅(一) 查看更多可关注后查看主页设计模式DayToDay专栏 一.UML概述 统一建模语言(Unified Modeling Language,UML),是一种用于软件系统分析和设计的语言工具。特点是简单、统一、图形化、能表达软件设计中的动态与静…

Matlab论文插图绘制模板第72期—金字塔图

前段时间,有朋友觉得一篇文章里的插图看着不错,问Matlab能不能实现: 想了想,Matlab中并没有现成的画图代码。 但本质上,这种图其实就是横向柱状图的变体,而横向柱状图的绘制模板之前有分享过: …

Java多线程:线程的优先级 || 线程的中断 || 线程的分类 || 线程的定时器

Java多线程:线程的优先级 || 线程的中断 || 线程的分类 || 线程的定时器 每博一文案 正如村上春树所说:“当暴风雨过去,你不会记得自己是如何度过的,你甚至不确定,暴风雨是否真正结束了, 但你已不再是当初…

分布式唯一ID的几种生成方案,一次性全掌握!

上一篇文章,我们聊了一下分库分表相关的一些基础知识,具体可以参见:《用真实业务场景告诉你,高并发下如何设计数据库架构?》。 这篇文章,我们就接着分库分表的知识,来具体聊一下全局唯一id如何…

Flutter 基础-上

一、初始化项目 Material Design (Google 推出的前端UI 解决方案) 官网: https://www.material.io/中文网: https://material-io.cn/ Flutter 中一切内容都是组件(Widget) 无状态组件(StatelessWidget)有状态组件(StatefulWidget) 二、app结构 MaterialApp title (任务管理器…

【VScode技巧】:platformio部署ESP32Cam开发板

学习目标: 前几天用Arduino开发了ESP32Cam,实现了人脸识别的功能,今天无聊想了想ESP32Can也可以在VScode的Platformio中使用,于是就试着配置了一下。以下是配置环境的过程,谢谢大家观看。 正所谓工欲善其事&#xff0c…

【零基础】学python数据结构与算法笔记10

文章目录前言57.链表介绍58.链表的创建和遍历59.链表的插入和删除60.双链表61.链表总结62.哈希表62.哈希表实现64.哈希表应用总结前言 学习python数据结构与算法,学习常用的算法, b站学习链接 57.链表介绍 链表是由一系列节点组成的元素集合。每个节点…

React配置文件(五) 配置less

代码如下: module.exports { webpack: override( addLessLoader({ lessOptions: { javascriptEnabled: true, modifyVars: { primary-color: #1DA57A }, }, }), adjustStyleLoaders(({ use: [, , postcss] }) > { const postcssOptions postcss.options postcss.options …

SEO初学者如何快速做好 SEO 优化?seo数据查询

昨天给大家介绍了seo的意义和重要性,今天让我们一起看看10个基本的SEO初学者技巧,如何优化网站以增加流量。 1. 研究关键词并使用尾词 关键词在SEO中起着重要的作用。关键字表明了你文章的主要主题,它使人们有可能在网上搜索感兴趣的主题时找…

RK3588平台开发系列讲解(日志篇)RK3588 syslog的使用

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、查看是否启用syslog.conf二、配置启用syslog.conf1、配置busybox2、添加配置文件3、编译buildroot烧录三、验证1、编写测试代码2、查看日志文件3、运行测试程序沉淀、分享、成长,让自己和他人都能有所收获!😄 …

SpringCloudAlibaba入门(2023版)

先知 架构图一览 创建Serve端 新建项目 配置文件 application.yaml server:port: 8080# Eureka配置 eureka:instance:## Eureka实例的名称hostname: localhostAclient:# false表示自己端就是注册中心,职责就是维护服务实例,并不需要去检查服务fetch-r…

Kafka-eagle 安装教程

参考资料: 参考视频 Kafka-eagle官网 解释:Kafka-eagle 后来更名为 EFAK ,所以打开官网会显示EFAK 环境准备: 要有本服务器可访问的MySQL服务,远程的请检查是否已经开启了MySQL远程访问,如果没有则需…

1.12 PWM实验

蜂鸣器--------TIM4 CH1/PB6 风扇-----------TIM1 CH1/PE9 马达-----------TIM16 CH1/PF6 一.PWM框图 RCC:使能GPIOB GPIOB:设置复用功能 TIM4:产生方波 二.分析RCC 确定总线,使能GPIOB和TIM4,GPIOE和TIM1,GPIO和TIM16 三.分…

【C++11】右值引用和移动语义

目录 一、左值 vs 右值 二、左值引用vs 右值引用 三、右值引用使用场景和意义 1. 左值引用的使用场景 2. 左值引用的短板 3. 右值引用和移动语义解决上述问题 四、右值引用引用左值的使用场景 五、完美转发 1. 模板中的&& 万能引用 2. std::forward 完美转发…

windows排查问题常用命令

查看JAVA进程占用PID: wmic process where caption"java.exe" get processid,caption,commandline /value查看进程端口信息:netstat -ano 或者 netstat -ano|findstr "8080" 或查看成功建立连接的:netstat -ano | findstr “ESTABLI…

C语言中的字符指针

目录1.字符指针指向一个字符2.字符指针指向一个字符串3.例题1.字符指针指向一个字符 int main() {char ch w;char *pc &ch;return 0; }将一个char类型的变量的地址放到一个char*类型的指针里去,这里的char*ps就是字符指针 在这里的字符指针与之前的整形指针等…

巧用gitbash的scp命令实现跨网段的文件直传

背景 嵌入式开发的工作流一般是这样的,程序员通过Windows电脑登陆Linux服务器,在服务器上编译出二进制文件后,先将文件scp到本地,然后再scp到Linux开发板,如下图所示 这样做需要执行两次scp命令,能否只执…

Golang cgo:如何在Go代码中调用C语言代码?

如何在Go代码中调用C语言代码? Go语言是通过自带的一个叫CGO的工具来支持C语言函数调用,同时我们可以用Go语言导出C动态库接口给其它语言使用。 方式一、直接在 Go 代码中写入 C 代码 检查是否开启cgo工具 首先,要查看是否已经开启cgo工具…

树状数组+例题

一、树状数组的定义 树状数组 或 二元索引树(Binary Indexed Tree),现多用于高效计算数列的前缀和, 区间和。它可以以 log(n)log(n)log(n) 的时间得到任意前缀和,也支持在log(n)log(n)log(n)时间内支持动态单点值的修改…