• 使用 docker 部署 elasticsearch 并安装 ik 中文分词器


    这是一篇本地 docker 部署笔记,基本上是参考以下文章。记录一些实际操作中遇到的问题。

    ElasticSearch最新版快速入门详解_静待花开-CSDN博客_elasticsearch入门
    ElasticSearch中文分词,看这一篇就够了_静待花开-CSDN博客_elasticsearch 中文分词
    最清晰易懂的Elasticsearch操作手册|收藏夹必备_静待花开-CSDN博客_elasticsearch 操作手册

    elasticsearch使用ik中文分词器 - SegmentFault 思否


    1 镜像准备

    docker search elasticsearch

    搜索 elasticsearch 可以看到如下镜像,

    这里使用第二个,集成了 es 和 kibana 。

    nshou/elasticsearch-kibana - Docker Image | Docker Hub

    拉取镜像

    docker pull nshou/elasticsearch-kibana

    创建并运行容器

    docker run -d -p 9200:9200 -p 9300:9300 -p 5601:5601 --name eskibana nshou/elasticsearch-kibana

    进入容器(这里的 ddade0ae3 是上一句返回的容器 ID)

    docker exec -it ddade0ae3 bash

    2 将数据/配置目录挂载

    如果不使用挂载,容器被删除之后,数据就没有了。实际使用中,通常将持久化数据挂载出来。
    需要挂载的文件/目录:配置文件,数据目录,插件目录。

    可以先将容器中默认的配置文件拷贝出来,免得自己新建一个。

    这里 018d550c168c 是容器 ID,命令在宿主机执行,执行目录是自己选定的一个准备用来挂载的目录。
    我这里的目录是:/Users/myname/Documents/docker/es/vol/eskibana

    docker cp 018d550c168c:/home/elasticsearch/kibana-7.16.2-linux-x86_64/config/kibana.yml ./kibana-bak/
    docker cp 018d550c168c:/home/elasticsearch/elasticsearch-7.16.2/config/elasticsearch.yml ./es-bak/

    将文件拷贝出来之后,准备挂载的目录。
    最终目录是这个样子,bak 目录是做备份用的。

    赋读写权限

    chmod -R 777 ./es
    chmod -R 777 ./kibana

    将之前运行起来的容器关闭(否则端口会占用),使用挂载运行新的容器

    docker run --name esk \
    -p 9200:9200 -p 9300:9300 -p 5601:5601 \
    -e "discovery.type=single-node" \
    -e ES_JAVA_OPTS="-Xms64m -Xmx512m" \
    -v /Users/xxx/Documents/docker/es/vol/eskibana/es/config/elasticsearch.yml:/home/elasticsearch/elasticsearch-7.16.2/config/elasticsearch.yml \
    -v /Users/xxx/Documents/docker/es/vol/eskibana/es/data:/home/elasticsearch/elasticsearch-7.16.2/data \
    -v /Users/xxx/Documents/docker/es/vol/eskibana/es/plugins:/home/elasticsearch/elasticsearch-7.16.2/plugins \
    -v /Users/xxx/Documents/docker/es/vol/eskibana/kibana/config/kibana.yml:/home/elasticsearch/kibana-7.16.2-linux-x86_64/config/kibana.yml \
    -v /Users/xxx/Documents/docker/es/vol/eskibana/kibana/data:/home/elasticsearch/kibana-7.16.2-linux-x86_64/data \
    -v /Users/xxx/Documents/docker/es/vol/eskibana/kibana/plugins:/home/elasticsearch/kibana-7.16.2-linux-x86_64/plugins \
    -d nshou/elasticsearch-kibana
    

    参考:
    Docker部署Elasticsearch
    docker安装ElasticSearch

    如果运行时发现如下错误,

    Error response from daemon: Mounts denied:
    The path /es/data is not shared from the host and is not known to Docker.
    You can configure shared paths from Docker -> Preferences... -> Resources -> File Sharing.
    See https://docs.docker.com/desktop/mac for more info.
    

    1 根据提示检查 docker 配置,2 使用绝对路径

    参考:关于 is not shared from OS X and is not known to Docker._程序和我有一个能跑就行了-CSDN博客

    3 安装中文分词插件

    我这里使用的是使用先手动下载,再使用命令安装的方式。

    3.1 从 github 下载插件 zip 包
    https://github.com/medcl/elasticsearch-analysis-ik/releases

    3.2 将 zip 包拷贝到容器中

    docker cp ./ik.zip f8ad1fb16b0:/home/elasticsearch/mytmp

    3.3 在容器中安装插件
    这句需要在 es 目录中的 bin 目录下运行,elasticsearch-plugin 并不是一个全局指令

    ./elasticsearch-plugin install file:///home/elasticsearch/mytmp/ik.zip

    安装完成插件之后,需要重启容器

    重启时,如果出现如下错误,
    Exception in thread "main" java.nio.file.NotDirectoryException: /home/elasticsearch/elasticsearch-7.16.2/plugins/.DS_Store
    则需要删除 plugins 目录中的 .DS_Store 文件

    ls -a
    rm .DS_Store

    然后重启容器

    测试中文分词

    POST /_analyze
    {
    "analyzer": "ik_max_word",
    "text": "且听风吟" 
    }
    

    结果:

    {
      "tokens" : [
        {
          "token" : "且听",
          "start_offset" : 0,
          "end_offset" : 2,
          "type" : "CN_WORD",
          "position" : 0
        },
        {
          "token" : "风吟",
          "start_offset" : 2,
          "end_offset" : 4,
          "type" : "CN_WORD",
          "position" : 1
        }
      ]
    }
    

    4 测试 ES 与 kibana

    访问 http://127.0.0.1:5601/ 以访问 kibana,在 dev tools 中做测试。
    使用 elasticsearch-head Chrome 插件查看数据。

    5 测试挂载效果

    将上面启动的容器关闭,使用上面的命令,启动一个新的容器

    docker run --name esk2 \
    -p 9200:9200 -p 9300:9300 -p 5601:5601 \
    -e "discovery.type=single-node" \
    -e ES_JAVA_OPTS="-Xms64m -Xmx512m" \
    -v /Users/xxx/Documents/docker/es/vol/eskibana/es/config/elasticsearch.yml:/home/elasticsearch/elasticsearch-7.16.2/config/elasticsearch.yml \
    -v /Users/xxx/Documents/docker/es/vol/eskibana/es/data:/home/elasticsearch/elasticsearch-7.16.2/data \
    -v /Users/xxx/Documents/docker/es/vol/eskibana/es/plugins:/home/elasticsearch/elasticsearch-7.16.2/plugins \
    -v /Users/xxx/Documents/docker/es/vol/eskibana/kibana/config/kibana.yml:/home/elasticsearch/kibana-7.16.2-linux-x86_64/config/kibana.yml \
    -v /Users/xxx/Documents/docker/es/vol/eskibana/kibana/data:/home/elasticsearch/kibana-7.16.2-linux-x86_64/data \
    -v /Users/xxx/Documents/docker/es/vol/eskibana/kibana/plugins:/home/elasticsearch/kibana-7.16.2-linux-x86_64/plugins \
    -d nshou/elasticsearch-kibana
    

    如果前一个容器没有删除,这里的 --name 需要取个新名字。

    如果一切正常,等待重启完成之后,之前的数据,kibana 中配的看板等,应该都还存在。

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
  • 相关阅读:
    多态的理解
    成员变量与实例变量&成员方法与构造方法&构造代码块和静态代码块&静态与非静态&重写与重载的区别
    Java的基本数据类型和基本数据类型之间的转换
    如何使float精确两位小数或多位小数
    Servlet程序的生命周期
    配置axios全局拦截器
    SpringCloud-Sentinel实现服务限流、熔断、降级,整合Nacos实现持久化
    Nginx+Lua OpenResty环境搭建
    Java-线程池面试题
    Rabbitmq死信队列
  • 原文地址:https://www.cnblogs.com/jasongrass/p/15755301.html
Copyright © 2020-2023  润新知