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即可。

posted @ 2020-12-13 22:45  兰翔  阅读(757)  评论(0编辑  收藏  举报