在学习elasticsearch
和 kibana
时,使用Docker
进行快速部署,但是,在虚拟机进行部署的时候,遇到了一些问题,在这就重头记录一下整个部署的过程。
镜像的下载
使用 Docker
来部署,其实是非常的简单的,这里我们选取的 elasticsearch
和 kibana
的版本均为 7.4.2
# 下载 elasticsearch
docker pull elasticsearch:7.4.2
# 下载 kibana
docker pull kibana:7.4.2
# 查看下载的镜像
docker images
创建 Elasticsearch 实例
在创建 Elasticsearch
实例之前,先在本机中创建一个自己的目录 , 如:/mydata/elasticsearch
, 然后再目录底下创建三个文件夹 data
、 config
和plugins
,为后面创建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]
错误原因: 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/"}
错误原因: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
即可。