概览
环境信息
- 以下是本次部署的环境信息,可以作为参考
- 操作系统: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_count
262144
若要查看设置的当前值,请运行: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
- 如果容器被终止,Elasticsearch 节点的数据不会丢失
- Elasticsearch 对 I/O 敏感,Docker 存储驱动程序不适合快速 I/O
- 它允许使用高级 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
说明:
- privileged=true 允许访问挂载目录
- "discovery.type=single-node" 单机版
- 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的报错,可能是以下原因:
- docker容器未启动;
#1、查看docker所有容器获取容器名称或id docker ps -a #2、根据容器名称或id启动容器 docker start es01
- 网络问题,网络配置修改了,但未重启网络;
#重启网络,使用命令: source /etc/profile
- 配置文件问题,文件修改过程中出错、挂载目录或者文件时无配置文件或文中缺少必要配置;
#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协议访问 。文章来源:https://www.toymoban.com/news/detail-769554.html
2.4、日志报:Error: index_not_found_exception
Root causes: index_not_found_exception: no such index [.kibana]
可参照以下解决:文章来源地址https://www.toymoban.com/news/detail-769554.html
- Error: [index_not_found_exception] no such index [.kibana_task_manager]_爱代码的小呆-华为云开发者联盟
- https://www.cnblogs.com/davidgu/p/6785039.html
到了这里,关于Elasticsearch+Kibana 的docker容器化部署与若干问题处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!