Elasticsearch+Kibana 的docker容器化部署与若干问题处理

概览

因为Elasticsearch的官方文档上写的不是很清楚会留下一些坑,所以本篇主要记录对docker搭建ElasticSearch+Kibana+ik分词器的过程和途中遇到的若干问题,既留给自己后面反复使用避免各种神坑,也可以为正在部署环境的读者提供一些参考。

环境信息

  • 以下是本次部署的环境信息,可以作为参考
  • 操作系统:Linux CentOS-7-x86_64
  • Docker:Docker  Desktop 19.03.12 
  • ElasticSearch:8.11.1
  • Kibana:8.11.1
  • IK分词器:elasticsearch-analysis-ik-8.11.1 

elasticsearch官网下载地址: Download Elasticsearch | Elastic

kibana官网下载地址:Download Kibana Free | Get Started Now | Elastic 

IK分词器下载地址:https://github.com/medcl/elasticsearch-analysis-ik 

注:Linux安装elasticsearch、kibana不知下什么版本的(如:x86_64/aarch64)可使用以下命令查看Linux CPU服务架构对应下载

uname -m

一、Elasticsearch的部署《官网文档

1、单节点集群

1.1、先创建一个docker网络

容器之间在一个局域网内,linux宿主机器可以与容器进行通信;但是外部的服务器是不能与容器直接通信的,如果需要则需要通过宿主机器端口的代理。

docker network create elastic

1.2、拉取 Elasticsearch Docker 镜像

可用docker search <镜像名称> 搜索镜像后拉取docker pull <镜像名称>,也可直接使用以下命令拉取官网的镜像

docker pull docker.elastic.co/elasticsearch/elasticsearch:8.11.1

查看docker中存在的镜像文件: docker imags

1.3、设置内核

Elasticsearch Linux环境下要设置内核,否则ES启动将会报错。设置为至少vm.max_map_count262144若要查看设置的当前值,请运行:vm.max_map_count。

grep vm.max_map_count /etc/sysctl.conf
vm.max_map_count=262144

要在实时系统上应用该设置,请运行:

sysctl -w vm.max_map_count=262144

1.4、根据内存大小配置堆 

官网建议“使用 Docker Desktop,请确保分配至少 4GB 的内存”。

  • 要在生产环境中手动设置堆大小,请绑定挂载 JVM 选项文件。 包括所需的堆大小设置。/usr/share/elasticsearch/config/jvm.options.d
  • 对于测试,您还可以使用环境变量手动设置堆大小。例如,若要使用 512MB,请使用以下命令。ES_JAVA_OPTS   ES_JAVA_OPTS="-Xms512m -Xmx512m"

提示:该变量将覆盖所有其他 JVM 选项。 不建议在生产中使用。ES_JAVA_OPTS

 1.5、挂载配置和启动 Elasticsearch 容器(推荐使用绑定挂载)

1.5.1、不挂载
docker run --name es01 --net elastic -p 9200:9200 -p 9300:9300 -it -e ES_JAVA_OPTS="-Xms64m -Xmx512m" docker.elastic.co/elasticsearch/elasticsearch:8.11.1

进入容器  ,对elasticsearch.yml进行相关配置。若进入容器后提示无相关命令可添加- u 0命令授权后 apt-get updata 安装vim.

docker exec -it es01 /bin/bash
docker exec -it -u 0 es01 /bin/bash
apt-get update 
apt-get install vim

vim config/elasticsearch.yml

# 配置集群名称(默认是被注释的,并且默认有一个集群名) 

cluster.name: "docker-cluster"
# 配置当前es节点名称(默认是被注释的,并且默认有一个节点名)
node.name: node-1
# 绑定地址为特定IP地址(设置其它节点和该节点交互的ip地址,如果不设置它会自动判断)默认为0.0.0.0,绑定这台机器的任何一个ip
network.host: 0.0.0.0

#安全模式,默认开启true,测试环境下可以关闭false

xpack.security.enabled: false

# 配置是否允许跨域
http.cors.enabled: true
# 允许哪些域跨域
http.cors.allow-origin: "*"

1.5.2、绑定挂载

出于以下原因,应使用绑定的卷:/usr/share/elasticsearch/data

  1. 如果容器被终止,Elasticsearch 节点的数据不会丢失
  2. Elasticsearch 对 I/O 敏感,Docker 存储驱动程序不适合快速 I/O
  3. 它允许使用高级 Docker 卷插件
  • 配置文件必须可由用户读取,默认情况下,Elasticsearch 以用户身份在容器内运行 uid:gid .elasticsearch1000:0。
  • 如果要绑定挂载本地目录或文件,则用户必须可以读取该目录或文件。 此外,此用户必须具有对配置、数据和日志目录的写入权限(Elasticsearch 需要对目录的写入权限,以便可以生成密钥库)。 一个好的策略是授予对本地目录的 gid 的组访问权限.。
  • 如果你共享的是多级的目录,可能会出现权限不足的提示。 这是因为CentOS7中的安全模块selinux把权限禁掉了,需要添加参数 --privileged=true 来解决挂载的目录没有权限的问题。

 准备一个本地目录,以便通过绑定挂载来存储数据:

mkdir /usr/local/docker_es
chmod g+rwx /usr/local/docker_es
chgrp 0 /usr/local/docker_es

创建Elasticsearch本地的date、config、plugins、logs目录。

# mkdir 创建指定目录层级
mkdir -p /usr/local/docker_es/config
mkdir -p /usr/local/docker_es/data 
mkdir -p /usr/local/docker_es/logs
mkdir -p /usr/local/docker_es/plugins 

因为创建容器的时候,会将宿主机的目录与容器内的目录进行映射,Docker 镜像的 默认情况下,内置文件包含此设置elasticsearch.yml network.host: 0.0.0.0。如果本地的config目录中缺少elasticsearch.yml和其中的配置项则容器将报错无法启动。使用以下命令

# 写入内容到指定xx.yml配置文件
echo "http.host: 0.0.0.0" >> /usr/local/docker_es/config/elasticsearch.yml

若需要较全的配置,则需创建临时的es容器,从中拷贝出来。

#创建临时容器-elasticsearch
docker run --name elasticsearch --net elastic  -d -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -e "discovery.type=single-node" -p 9200:9200 -p 9300:9300 docker.elastic.co/elasticsearch/elasticsearch:8.11.1
#拷贝至挂载目录
docker cp -a elasticsearch:/usr/share/elasticsearch/config  /usr/local/docker_es/config
docker cp -a elasticsearch:/usr/share/elasticsearch/data  /usr/local/docker_es/data
docker cp -a elasticsearch:/usr/share/elasticsearch/plugins  /usr/local/docker_es/plugins
#删除临时容器-elasticsearch
docker stop elasticsearch
docker rm elasticsearch

配置elasticsearch.yml,注:这里安全模式是开启的,kibana连接时需生成的注册令牌

# 启动地址,如果不配置,只能本地访问
  network.host: 0.0.0.0
# 节点名称
  node.name: node-name
# 节点列表
  discovery.seed_hosts: ["192.168.209.132"]
# 初始化时master节点的选举列表
  cluster.initial_master_nodes: [ "node-name" ]
# 集群名称
  cluster.name: cluster-name
# 对外提供服务的端口
  http.port: 9200
# 内部服务端口
  transport.port: 9300    
# 跨域支持
  http.cors.enabled: true
# 跨域访问允许的域名地址(正则)
  http.cors.allow-origin: /.*/
#安全模式
  xpack.security.enabled: true

 创建正式es容器

docker run -p 9200:9200 -p 9300:9300 \
--privileged=true --name es01 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx512m" \
-v /usr/local/docker_es/plugins:/usr/share/elasticsearch/plugins \
-v /usr/local/docker_es/data:/usr/share/elasticsearch/data \
-v /usr/local/docker_es/logs:/usr/share/elasticsearch/logs \
-v /usr/local/docker_es/config:/usr/share/elasticsearch/config \
-d docker.elastic.co/elasticsearch/elasticsearch:8.11.1

说明:

  1.  privileged=true 允许访问挂载目录
  2. "discovery.type=single-node" 单机版
  3. ES_JAVA_OPTS="-Xms512m -Xmx512m"  设置 “JAVA虚拟器占用的内存大小,-Xms64m:初始64M;-Xmx512m:最大占用512M”,如果不设置就启动,默认会占用整个服务器内存,如果是本地搭建的虚拟机,容易卡死,建议根据实际情况设置大小。 
1.5.3、数据卷挂载
docker run -d \
    --name es \
    --privileged \
    --network elastic \
    -p 9200:9200 \
    -p 9300:9300 \
    -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
    -e "discovery.type=single-node" \
    -v es-data:/usr/share/elasticsearch/data \
    -v es-plugins:/usr/share/elasticsearch/plugins \
   docker.elastic.co/elasticsearch/elasticsearch:8.11.1

 命令解释:

-e "discovery.type=single-node":非集群模式
-v es-data:/usr/share/elasticsearch/data:挂载逻辑卷,绑定es的数据目录
-v es-logs:/usr/share/elasticsearch/logs:挂载逻辑卷,绑定es的日志目录
-v es-plugins:/usr/share/elasticsearch/plugins:挂载逻辑卷,绑定es的插件目录
--network elastic :加入elastict的网络中 (kibana也会加入,在同一个docker网络中,访问时可以直接配置为容器名称)
-p 9200:9200:端口映射配置 (9200端口用户访问 9300端口将来各个节点之间互联的端口,目前用不上)

-v 本地卷:容器目录
若本地卷没有,应该会帮你创建,通过docker volume inspect 卷名查看卷信息,其中就有本地目录 

# 查看所有数据卷
docker volume ls
# 查看数据卷详细信息卷
docker volume inspect es-data

安全模式xpack.security.enabled:true

 对于启用安全模式xpack.security.enabled:true的需使用一下命令打印 Kibana 的用户密码和注册令牌,为false不启用则无需打印。()

docker exec -it es01 /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic
docker exec -it es01 /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibanad

cp Kibana 的用户密码和注册令牌Kibana登录时会用到

Password for the [elastic] user successfully reset.
New value: 3_J35UWr2sIUkyxxxxxx

1.6、测试是否部署成功

1.6.1、无安全模式下测试:

 浏览器访问 http://ip:9200(ip为服务器地址),能访问成功,就是正常

 1.6.2、安全模式下测试:

由于es开方的https服务,所以首先把证书从容器中导出来,后面的curl请求都要指定这个证书 

docker cp es01:/usr/share/elasticsearch/config/certs/http_ca.crt .
  • 当前目录下新增名为http_ca.crt的文件,就是安全证书了,对 Elasticsearch 进行 REST API 调用,以确保 Elasticsearch 容器正在运行。
curl --cacert http_ca.crt -u elastic:$ELASTIC_PASSWORD https://localhost:9200

  • 浏览器访问 https://ip:9200(ip为服务器地址)后会弹出登录页面了,如下图,填写账号elastic,密码是刚才cp的。

二、Kibana的部署

拉取 Kibana Docker 镜像

直接官网拉取镜像

docker pull docker.elastic.co/kibana/kibana:8.11.2

或使用命令搜索镜像拉取 

#搜索kibana镜像
docker search kibana
#根据搜索到的镜像名称进行拉取
docker pull kibana

创建kibana配置文件kibana.yml并写入相关配置。

echo -e "server.host: "0.0.0.0"\nserver.shutdownTimeout: "5s" \nelasticsearch.hosts: "http://elasticsearch:9200" \ni18n.locale: zh-CN ">> /usr/local/docker_kibana/config/kibana.yml

 说明:命令格式:echo [参数] [字符串] 

-e:允许输出字符串中的转义字符, “\n”为换行符

            # http访问端口
            server.port: 5601
            # ip地址,0.0.0.0表示可远程访问
             server.host: "0.0.0.0"

            #修改en为zh-CN 控制面板为中文
             i18n.locale: "zh-CN"

运行docker命令进行部署

docker run -d \
--name kib01 \
--net elastic \
-v /usr/local/docker_kibana/config:/usr/share/kibana/config \
-p 5601:5601  \
 kibana:8.11.1

 注:这里挂载了kibana的config目录,需对本地目录进行授权

chmod -R 777 /usr/local/docker_kibana

 通过以下命令查看kibana是否成功运行

#动态查看日志文件后100行
docker logs -f --tail 100 kib01

 

 在浏览器输入地址访问:http://服务器ip:5601,即可看到结果。若elasticsearch未开启安全模式则手动配置,配置时需指定es的服务IP且使用的协议为HTTP协议,若使用HTTPS协议则会提示:无法连接到集群。 

 

 使用以下命令获取验证码

docker exec -it kib01 bin/kibana-verification-code

三、安装IK分词器

1、elasticsearch使用挂载的

使用绑定挂载的在elasticsearch挂载本地目录plugins下创建analysis-ik目录。

使用数据卷挂载的通过命令docker volume inspect 卷名查看卷信息,其中就有本地目录 

cd /usr/local/docker_es/plugins
mkdir analysis-ik

将ik分词器压缩文件直接上传置analysis-ik下(这里我是放在/usr/local)

2、elasticsearch未使用挂载的

可先将IK分词器压缩包上传自定义目录下后进行解压。

使用以下命令将解压后的ikf分词器文件analysis-ik拷贝至elasticsearch容器的/usr/share/elasticsearch/plugins目录下

#docker cp <本地文件路径> <容器名称>:<目标容器路径>
docker cp analysis-ik/ es02:/usr/share/elasticsearch/plugins
#验证文件是否拷贝成功
docker exec -it es02 ls /usr/share/elasticsearch/plugins

解压IK分词器压缩包 

由于这里是zip包不是gz包,所以我们需要使用unzip命令进行解压,如果本机环境没有安装unzip,请执行

yum install -y unzip zip
#unzip的语法:unzip [选项] 压缩包名 源文件或源目录列表    -d<目录> 指定文件解压缩后所要存储的目录
unzip elasticsearch-analysis-ik-8.11.1.zip -d  /usr/local/docker_es/plugins/analysis-ik
#在plugins/analysis-ik目录下的可直接使用unzip解压
unzip elasticsearch-analysis-ik-8.11.1.zip

记得一定要重启Elasticsearch!!!  

四、可能遇到的问题:

1、elasticsearch的报错

1.1、进入容器报错:Error response from daemon: Container XXXX is not runnin。

根据docker的报错,可能是以下原因:

  1. docker容器未启动;
    #1、查看docker所有容器获取容器名称或id
    docker ps -a
    #2、根据容器名称或id启动容器
    docker start es01
  2. 网络问题,网络配置修改了,但未重启网络;
    #重启网络,使用命令:
    source /etc/profile
  3. 配置文件问题,文件修改过程中出错、挂载目录或者文件时无配置文件或文中缺少必要配置
    #1、写入内容到指定xx.yml配置文件
    echo "http.host: 0.0.0.0" >> /usr/local/elasticsearch/config/elasticsearch.yml 
    #2、重启容器
    docker restart es01
    #3、查看docker容器中启动的进程
    docker ps
    
    
1.2、进入容器后,vi elasticsearch.yml 提示 bash: vi: command not found。使用apt-get update报错E: List directory /var/lib/apt/lists/partial is missing. - Acquire (13: Permission denied)
原因是权限不足,添加在进入容器命令里添加 -u 0 apt-get update  再使用命令 apt-get install vim
docker exec -u 0 -it id /bin/bash

 2、kibana的报错

2.1、在浏览器kiban界面进行配置输入验证码后提示:Couldn't write to config file。查看kibana日志报:[ERROR][plugins.interactiveSetup.routes] Kibana process does not have enough permissions to write to config file 

 原因是挂载的kibana config目录未授权,对其进行授权即可。

chmod -R 777 <挂载的文件路径>

2.2、Kibana启动后界面显示:Kibana server is not ready yet 

使用docker命令查看日志信息

#动态查看kibana容器的日志后100行
docker logs -f --tail 100 kibana

日志报错信息如下:

 {"type":"log","@timestamp":"2022-04-13T09:01:06+00:00","tags":["error","elasticsearch-service"],"pid":8,"message":"Unable to retrieve version information from Elasticsearch nodes. getaddrinfo ENOTFOUND elasticsearch"}

kibana 连接不到Elasticsearch 节点,原因

由于未配置kibana和elasticsearch在同一网络环境下,而kibana.yml中elasticsearch.hosts=["http://localhost:9200"],或者elasticsearch.hosts=["http://elasticsearch:9200"],未将其私有IP导致,需要使用私有IP,如elasticsearch.hosts=["http://192.168.204.10:9200"]。

2.3、kibana日志报:[ERROR][plugins.interactiveSetup.elasticsearch] Unable to connect to host "https://192.168.204.10:9200": write EPROTO C017EC6B6C7F0000:error:0A00010B:SSL routines:ssl3_get_record:wrong version   number:../deps/openssl/openssl/ssl/record/ssl3_record.c:354:

原因是elasticsearch未开启安全模式,则不能使用https协议访问,需使用http协议访问 。

2.4、日志报:Error: index_not_found_exception
Root causes: index_not_found_exception: no such index [.kibana] 

 可参照以下解决:

  • 21
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是在Docker上安装ElasticsearchKibana的步骤: 1. 安装DockerDocker Compose 2. 创建一个文件夹并在其中创建一个名为docker-compose.yml的文件 3. 在docker-compose.yml文件中添加以下内容: ``` version: '3' services: es01: image: docker.elastic.co/elasticsearch/elasticsearch:7.15.1 container_name: es01 environment: - node.name=es01 - discovery.seed_hosts=es02 - cluster.initial_master_nodes=es01,es02 - bootstrap.memory_lock=true - "ES_JAVA_OPTS=-Xms512m -Xmx512m" ulimits: memlock: soft: -1 hard: -1 volumes: - esdata01:/usr/share/elasticsearch/data ports: - 9200:9200 networks: - esnet es02: image: docker.elastic.co/elasticsearch/elasticsearch:7.15.1 container_name: es02 environment: - node.name=es02 - discovery.seed_hosts=es01 - cluster.initial_master_nodes=es01,es02 - bootstrap.memory_lock=true - "ES_JAVA_OPTS=-Xms512m -Xmx512m" ulimits: memlock: soft: -1 hard: -1 volumes: - esdata02:/usr/share/elasticsearch/data networks: - esnet kibana: image: docker.elastic.co/kibana/kibana:7.15.1 container_name: kibana environment: ELASTICSEARCH_URL: http://es01:9200 ports: - 5601:5601 networks: - esnet volumes: esdata01: driver: local esdata02: driver: local networks: esnet: ``` 4. 保存并关闭文件 5. 在终端中导航到该文件夹并运行以下命令: ``` docker-compose up -d ``` 6. 等待一段时间,直到所有容器都启动并运行 7. 打开浏览器并输入以下地址来访问Kibana: ``` http://localhost:5601 ``` 8. 你现在可以开始使用ElasticsearchKibana进行数据分析和可视了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值