zoukankan      html  css  js  c++  java
  • Elasticsearch(二) Docker 部署 Elasticsearch 及 Kibana (安装过程填坑)

    在学习elasticsearchkibana 时,使用Docker 进行快速部署,但是,在虚拟机进行部署的时候,遇到了一些问题,在这就重头记录一下整个部署的过程。

    镜像的下载

    使用 Docker 来部署,其实是非常的简单的,这里我们选取的 elasticsearchkibana 的版本均为 7.4.2

    # 下载 elasticsearch
    docker pull elasticsearch:7.4.2
    # 下载 kibana
    docker pull kibana:7.4.2
    # 查看下载的镜像
    docker images
    

    image-20201213214117426

    创建 Elasticsearch 实例

    在创建 Elasticsearch 实例之前,先在本机中创建一个自己的目录 , 如:/mydata/elasticsearch , 然后再目录底下创建三个文件夹 dataconfigplugins,为后面创建elasticsearch实例时,可以做一个文件映射,便于我们对 es 实例进行修改。
    同时,在 config 文件夹里,新建 elasticsearch.yml 配置文件,并配置 es 可以被远程的任何机器进行访问

    mkdir -p /mydata/elasticsearch/data
    mkdir -p /mydata/elasticsearch/config
    mkdir -p /mydata/elasticsearch/plugins
    # 写入配置
    echo "http.host: 0.0.0.0" >> /mydata/elasticsearch/config/elasticsearch.yml
    # 这里需要设置一下文件夹的权限。原因: 做文件夹映射后,需要对 本机文件夹 进行读写操作,如果不给权限的话,docker 将没有权限来完成读写,后期启动会报错
    chmod -R 777 /mydata/elasticsearch
    

    启动 elasticsearch 实例

    docker run --name elasticsearch -p 9200:9200 -p 9300:9300 
    -e "discovery.type=single-node" 
    -e ES_JAVA_OPTS="-Xms64m -Xmx256m" 
    -v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml 
    -v /mydata/elasticsearch/data:/usr/share/elasticsearch/data 
    -v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins 
    -d elasticsearch:7.4.2
    
    # 查看运行的实例
    docker ps
    

    -e "discovery.type=single-node" : 设置 es 为单节点运行
    -e ES_JAVA_OPTS="-Xms64m -Xmx256m": 设置 es 的最小内存使用 64M ,最大内存使用为 256 M
    -v : 设置 本机文件夹与实例内部的映射

    访问 http://主机IP:9200 ,能看到如下信息,即为创建成功

    创建 kibana 实例

    kibana只需要创建实例,关联我们刚刚的 es 即可

    # 这里需要将主机 IP 修改为 对应的主机IP
    docker run --name kibana -e ELASTICSEARCH_HOSTS=http://本机ip:9200 
    -p 5601:5601 -d kibana:7.4.2 
    

    如果使用虚拟机搭建环境,建议将虚拟机设置为固定 IP,也方便后期的访问

    访问 http://主机ip:5601 ,看到如下页面即为创建成功

    启动时的各种报错

    Elasticsearch

    [1]expecting token of type [START_OBJECT] but found [VALUE_STRING]

    image-20201213215359977

    错误原因: elasticsearch.yml 文件内部错误

    解决方案: 仔细检查yml文件中的配置项书写格式: name:(空格)value 注意 冒号后面后个空格

    [2] java.nio.file.AccessDeniedException: /usr/shar/elasticsearch/data/nodes

    错误原因: 没有权限,做文件夹关联之后,docker 内部的 es 需要将 data 数据同时保存到 本机的 文件夹上,权限不足,无法写入

    解决方案: 对共享的文件夹开放权限,重启es实例即可

    # 开放所有权限  这里修改为对应的本机文件夹路径即可
    chmod -R 777 /mydata/elasticsearch
    # 重启 es 
    docker restart elasticsearch
    

    Kibana

    [1] {.. "message" : "Unable to revive connection: http://ip:9200/"}

    image-20201213221158620

    错误原因:Docker容器中启动服务和直接在Linux环境下安装服务,会有ip上的区别,不在是服务器的物理ip, 而是容器对外暴露对的ip,。

    解决方案: 通过docker inspect elasticsearch查看ES实例暴露出来的ip 。停止并删除现有的Kibana容器,然后重新启动kibana并添加环境变量参数:-e ELASTICSEARCH_HOSTS="http://es暴露的IP:9200"

    # 停止实例
    docker stop kibana
    # 删除实例
    docker rm kibana
    # 查看 es 实例暴露的IP
    docker inspect elasticsearch
    # 重新创建实例
    docker run --name kibana -e ELASTICSEARCH_HOSTS=http://172.17.0.3:9200 
    -p 5601:5601 -d kibana:7.4.2 
    

    查看 es 实例暴露的IP:

    但是如上解决方案存在一个问题:这个 IPAddress 是 docker 容器 自动分配的,也就是说,每当主机重启,或者实例重启之后,这个 ip 是会变化的,也就使得 需要再次配置 kibana,故 在这提供一个新的解决方案

    解决方案二:

    1、创建一个 docker 的 bridge 网络

    # 查看docker网络信息
    docker network ls
    # 新建一个bridge网络
    docker network create --driver bridge --subnet=172.18.0.0/16 --gateway=172.18.0.1 mynet
    # 查看新建网络信息
    docker network inspect mynet
    

    2、停止和删除原来的 elasticsearch 和 kibana

    docker stop elasticsearch
    docker rm elasticsearch
    docker stop kibana
    docker rm kibana
    

    3、使用新的 bridge 创建 elasticsearch 和 kibana 实例 并直接指定 IP

    # 创建 elasticsearch 实例
    docker run --name elasticsearch --network mynet --ip 172.18.0.5
    -p 9200:9200 -p 9300:9300 
    -e "discovery.type=single-node" 
    -e ES_JAVA_OPTS="-Xms64m -Xmx256m" 
    -v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml 
    -v /mydata/elasticsearch/data:/usr/share/elasticsearch/data -v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins 
    -d elasticsearch:7.4.2
    # 创建 kibana 实例
    docker run --name kibana  --network mynet --ip 172.18.0.103 
    -e ELASTICSEARCH_HOSTS=http://172.18.0.5:9200 
    -p 5601:5601 -d kibana:7.4.2
    

    解释一下为什么要新建一个新的 bridge 网络环境:

    Docker创建容器时默认采用bridge网络,自行分配ip,不允许自己指定。在实际部署中,我们需要指定容器ip,不允许其自行分配ip,尤其是搭建集群时,固定ip是必须的。故,如果需要分配固定的ip,我们可以创建自己的bridge网络 ,如: mynet,创建容器的时候指定网络为mynet并指定ip即可。

  • 相关阅读:
    sql server 数据库还原后sa连接不上原因
    A potentially dangerous Request.Form value was detected from the client的解决办法
    单引号引发的血案
    再次拿起live writer
    临汾第一站软件工作室网站建成运行……
    集思广益,求工作室名称
    IT人们给个建议
    博客园有没有改版的必要
    20151213调转页面以及页面传值
    20151018网页大纲
  • 原文地址:https://www.cnblogs.com/lanxiang/p/14130866.html
Copyright © 2011-2022 走看看