09-02 周一 Ubuntu上使用docker-compose部署elasticsearch和kibana服务

本文主要是介绍09-02 周一 Ubuntu上使用docker-compose部署elasticsearch和kibana服务,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

09-02 周一 Ubuntu上部署elasticsearch和kibana服务
时间版本修改人描述
2024年9月2日11:13:54V0.1宋全恒新建文档

简介

 由于组里需要提供一个简易的环境来部署一套服务,可以通过接口进行数据的存储和检索,因此,直接部署一套ES服务来充当这样的功能,本文主要是负责记录整个环境的搭建过程。

步骤

确定docker命令可以使用

songquanheng@zhangyi-H3C-UniServer-R4900-G5:/var/run$ ll | grep docker
drwx------  5 root              root     120 Sep  2 11:05 docker/
-rw-r--r--  1 root              root       6 Sep  2 11:05 docker.pid
srw-rw----  1 root              docker     0 Aug 23 17:33 docker.sock=

 这说明无法使用docker,将当前用户加入docker用户组,并更新用户

从输出中可以看到,/var/run/docker.sock 的权限是 srw-rw----,它的所有者是 root,组是 docker。因此,只有 root 用户和 docker 组中的用户可以访问该套接字。

如果你仍然收到权限错误信息,可能是因为以下几个原因:

  1. 当前用户尚未被正确添加到 docker 组。
  2. 添加到 docker 组的更改尚未生效。

解决步骤:

  1. 确认当前用户是否在 docker 组中

请运行以下命令,确认当前用户是否在 docker 组中:

groups $(whoami)

输出结果中应该包含 docker,例如:

songquanheng : songquanheng docker

如果没有看到 docker,请按照下一步操作。

  1. 将用户添加到 docker

如果当前用户还没有加入 docker 组,请运行以下命令将其添加进去:

bash
Copy code
sudo usermod -aG docker $(whoami)
  1. 重新加载组信息或重新登录

添加用户到 docker 组后,你需要重新加载组信息或注销并重新登录才能生效。

3.1 重新加载组信息

运行以下命令:

newgrp docker

注,上述命令是非常关键的。

newgrp docker 是一个 Linux 命令,用于切换当前会话的用户组,或重新加载用户组配置。

作用

  • 切换当前用户的活动组:在 Linux 系统中,每个用户可以属于多个组,但每个会话只能有一个活动组。newgrp 命令用于切换到另一个组,使得后续在该终端中的所有操作都以新的组身份进行。
  • 重新加载组信息:当你将用户添加到一个新的组(如 docker 组)后,通常需要重新登录才能使更改生效。使用 newgrp docker 可以立即应用这个更改,而不需要完全注销并重新登录。

用例

在将用户添加到 docker 组后,运行 newgrp docker 可以立即让当前终端会话感知到这个更改,使得你能够立即运行需要组权限的命令,比如 docker ps,而不需要注销或者重启终端。

3.2 重新登录

如果你选择完全注销并重新登录,也会使更改生效。

  1. 验证修复

重新登录或加载组信息后,再次尝试运行 Docker 命令:

bash
Copy code
docker ps

如果成功执行,说明问题已解决。

建立docker-compose.yaml

version: '3.8'
services:elasticsearch:image: elasticsearch:8.15.0container_name: elasticsearchenvironment:- node.name=es01- cluster.name=docker-cluster- discovery.type=single-node- bootstrap.memory_lock=true- "ES_JAVA_OPTS=-Xms1g -Xmx1g"- xpack.security.enabled=false  # 禁用安全功能,方便初始测试ulimits:memlock:soft: -1hard: -1volumes:- /data/es_data:/usr/share/elasticsearch/dataports:- "9200:9200"networks:- elastickibana:image: kibana:8.15.0container_name: kibanaenvironment:- ELASTICSEARCH_HOSTS=http://elasticsearch:9200ports:- "5601:5601"networks:- elasticnetworks:elastic:driver: bridge

 关于数据存储目录,参加如下内容

Kibana 容器不需要与 Elasticsearch 相同的数据目录。这是因为 Elasticsearch 和 Kibana 的角色不同,它们的存储需求也不同:

Elasticsearch 和 Kibana 的不同角色

  1. Elasticsearch:
    • 角色: Elasticsearch 是一个搜索和分析引擎,它负责存储、索引和检索数据。它将数据持久化存储在磁盘上,因此需要一个数据目录来保存索引数据、配置文件、日志等。
    • 数据目录: 在 Docker 环境中,这通常映射到容器内部的 /usr/share/elasticsearch/data 目录。在你的配置中,已经将这个目录映射到主机的 /data/es_data 路径中。
  2. Kibana:
    • 角色: Kibana 是一个用于可视化和管理 Elasticsearch 数据的工具。它不直接存储数据,而是依赖 Elasticsearch 来提供数据查询结果。Kibana 本身主要用于管理配置文件、插件和用户会话等。
    • 数据持久化: Kibana 的大部分数据(如用户设置、仪表板等)是存储在 Elasticsearch 中的索引中,而不是在 Kibana 自己的文件系统中。因此,Kibana 不需要像 Elasticsearch 那样的大量持久化存储。

Kibana 的存储需求

Kibana 本身可能只需要在本地存储少量的日志文件或缓存数据。因此,通常你不需要为 Kibana 容器设置专门的持久化数据目录。

总结

  • Elasticsearch 需要一个持久化的数据目录,因为它是数据存储引擎。
  • Kibana 不需要与 Elasticsearch 相同的数据目录,因为它主要依赖 Elasticsearch 来处理数据。Kibana 的配置和元数据大多存储在 Elasticsearch 中,而不是本地文件系统。

因此,在 docker-compose.yml 文件中,你只需为 Elasticsearch 设置数据目录映射,而 Kibana 不需要这样的配置。如果有特殊需求(例如 Kibana 插件存储、日志文件持久化等),可以为 Kibana 配置一个卷,但这通常不是必需的。

安装docker-compose

sudo curl -L "https://github.com/docker/compose/releases/download/v2.29.0/docker-compose-$(uname -s)-$(uname -m)" 
-o /usr/local/bin/docker-compose

为二进制文件赋予权限

sudo chmod +x /usr/local/bin/docker-compose

启动容器

使用docker-compose管理一组容器,

songquanheng@zhangyi-H3C-UniServer-R4900-G5:~/es$ docker-compose up -d
WARN[0000] /home/songquanheng/es/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion 
[+] Running 3/3✔ Network es_elastic       Created                                                                                                                         0.1s ✔ Container elasticsearch  Started                                                                                                                         0.5s ✔ Container kibana         Started  

解决问题,/usr/share/elasticsearch/data不可写问题

,"error.message":"failed to obtain node locks, tried [/usr/share/elasticsearch/data]; maybe these locations are not writable or multiple nodes were started on the same data path?","error.stack_trace":"java.lang.IllegalStateException: failed to obtain node locks, tried [/usr/share/elasticsearch/data]; maybe these locations are not writable or multiple nodes were started on the same data path?\n\tat org.elasticsearch.server@8.15.0/org.elasticsearch.env.NodeEnvironment.<init>(NodeEnvironment.java:293)\n\tat org.elasticsearch.server@8.15.0/org.elasticsearch.node.NodeConstruction.validateSettings(NodeConstruction.java:513)\n\tat org.elasticsearch.server@8.15.0/org.elasticsearch.node.NodeConstruction.prepareConstruction(NodeConstruction.java:260)\n\tat org.elasticsearch.server@8.15.0/org.elasticsearch.node.Node.<init>(Node.java:192)\n\tat org.elasticsearch.server@8.15.0/org.elasticsearch.bootstrap.Elasticsearch$2.<init>(Elasticsearch.java:242)\n\tat org.elasticsearch.server@8.15.0/org.elasticsearch.bootstrap.Elasticsearch.initPhase3(Elasticsearch.java:242)\n\tat org.elasticsearch.server@8.15.0/org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:76)\nCaused by: java.io.IOException: failed to obtain lock on /usr/share/elasticsearch/data\n\tat org.elasticsearch.server@8.15.0/org.elasticsearch.env.NodeEnvironment$NodeLock.<init>(NodeEnvironment.java:238)\n\tat org.elasticsearch.server@8.15.0/org.elasticsearch.env.NodeEnvironment$NodeLock.<init>(NodeEnvironment.java:206)\n\tat org.elasticsearch.server@8.15.0/org.elasticsearch.env.NodeEnvironment.<init>(NodeEnvironment.java:285)\n\t... 6 more\nCaused by: java.nio.file.NoSuchFileException: /usr/share/elasticsearch/data/node.lock\n\tat java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:92)\n\tat java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:106)\n\tat java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111)\n\tat java.base/sun.nio.fs.UnixPath.toRealPath(UnixPath.java:886)\n\tat org.apache.lucene.core@9.11.1/org.apache.lucene.store.NativeFSLockFactory.obtainFSLock(NativeFSLockFactory.java:94)\n\tat org.apache.lucene.core@9.11.1/org.apache.lucene.store.FSLockFactory.obtainLock(FSLockFactory.java:43)\n\tat org.apache.lucene.core@9.11.1/org.apache.lucene.store.BaseDirectory.obtainLock(BaseDirectory.java:44)\n\tat org.elasticsearch.server@8.15.0/org.elasticsearch.env.NodeEnvironment$NodeLock.<init>(NodeEnvironment.java:231)\n\t... 8 more\n\tSuppressed: java.nio.file.AccessDeniedException: /usr/share/elasticsearch/data/node.lock\n\t\tat java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:90)\n\t\tat java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:106)\n\t\tat java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111)\n\t\tat java.base/sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:261)\n\t\tat java.base/java.nio.file.Files.newByteChannel(Files.java:379)\n\t\tat java.base/java.nio.file.Files.createFile(Files.java:657)\n\t\tat org.apache.lucene.core@9.11.1/org.apache.lucene.store.NativeFSLockFactory.obtainFSLock(NativeFSLockFactory.java:84)\n\t\t... 11 more\n"}

权限问题:

  • 错误信息中提到的 AccessDeniedExceptionNoSuchFileException,表明 Elasticsearch 容器内的 /usr/share/elasticsearch/data 目录可能无法访问或没有正确的权限。
  • 容器尝试创建或访问锁文件 (node.lock) 时,被系统拒绝访问,或者该文件无法创建。

 宿主机上执行

sudo chmod -R 775 /data/es_data

 这个问题的原因是两个用户体系不同导致的,因为在宿主机上的用户和镜像启动的容器中用户体系是不同的。在容器中启动的用户是elasticsearch,而宿主机上并没有这个用户elasticsearch用户。

 另外,由于镜像内,elasticsearch在容器中,用户

elasticsearch和kibana服务

elasticsearch服务

在本地使用浏览器访问地址获取Elasticsearch是否正常运行

http://10.15.32.121:9200/

 可以得到如下的响应

{"name": "es01","cluster_name": "docker-cluster","cluster_uuid": "XCBd08pwQtKCDGEpbSlmKQ","version": {"number": "8.15.0","build_flavor": "default","build_type": "docker","build_hash": "1a77947f34deddb41af25e6f0ddb8e830159c179","build_date": "2024-08-05T10:05:34.233336849Z","build_snapshot": false,"lucene_version": "9.11.1","minimum_wire_compatibility_version": "7.17.0","minimum_index_compatibility_version": "7.0.0"},"tagline": "You Know, for Search"
}

获取集群健康信息

 浏览器打开如下地址:

http://10.15.32.121:9200/_cluster/health?pretty

 得到如下输出

{"cluster_name": "docker-cluster","status": "green","timed_out": false,"number_of_nodes": 1,"number_of_data_nodes": 1,"active_primary_shards": 28,"active_shards": 28,"relocating_shards": 0,"initializing_shards": 0,"unassigned_shards": 0,"delayed_unassigned_shards": 0,"number_of_pending_tasks": 0,"number_of_in_flight_fetch": 0,"task_max_waiting_in_queue_millis": 0,"active_shards_percent_as_number": 100
}

 上述为单节点。green表示集群健康状态良好。

验证kibana服务

 浏览器访问地址

http://10.15.32.121:5601/

 打开左侧菜单,进入Dev Tools,可直接通过接口请求Elasticsearch中数据。

在这里插入图片描述

总结

 至此,我们就通过镜像,通过docker-compose容器编排引擎简单的完成了Elasticsearch+kibana的环境了,

 而且可以方便的移植到其他的地方。唯一需要的,只是docker-compose,总之,想要在一个新的环境中完成上述环境的部署,我们需要如下的步骤:

  1. 完成docker的安装
  2. 完成docker-compose的安装
  3. 构建docker-compose.yml文件
  4. 启动和验证。

这篇关于09-02 周一 Ubuntu上使用docker-compose部署elasticsearch和kibana服务的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1132301

相关文章

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

C#中lock关键字的使用小结

《C#中lock关键字的使用小结》在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时,其他线程无法访问同一实例的该代码块,下面就来介绍一下lock关键字的使用... 目录使用方式工作原理注意事项示例代码为什么不能lock值类型在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时