docker部署elasticsearch8.x
- 提示
- 1 注意版本差别
- 1.1 docker修改配置
- 1.1.2 docker使用vim报命令不存在的解决办法
- 1.1.3 docker 容器内报错 E: List directory /var/lib/apt/lists/partial is missing. - Acquire ( : No such file or directory) 或者其他权限 PermissionError: [Errno 13] Permission denied:
- 2 开放端口
- 3 docker创建网络
- 4 docker部署elasticsearch单机版
- 4.1 创建存储elasticsearch配置的目录
- 4.2 创建临时es节点
- 4.3 拷贝es配置
- 4.4 创建真实的es节点
- 4.5 浏览器访问ip:9200
- 4.5.1 关闭安全验证
- 4.5.2 将https改为http
- 4.5.3 重置es密码
- 4.6 es添加其他用户
- 4.6.1 添加kibana_system用户
- 4.6.2 添加logstash用户
- 4.6.3 重置用户密码
- 5 kibana
- 5.1 创建存储kibana配置的目录
- 5.2 创建临时kibana节点
- 5.3 拷贝kibana配置
- 5.4 创建真实kibana节点
- 5.5 加入es登录的账号密码
- 5.6 Dev Tools
- 6 安装IK分词器
- 6.1 在线安装ik插件(较慢)
- 6.2 离线安装ik插件(推荐)
- 6.3 测试
- 7 扩展词词典、停用词词典
- 7.1 扩展词词典
- 7.2 停用词词典
- 8 部署docker-compose
- 8.1 dockr-compose命令
- 9 部署es集群
- 9.1 编写docker-compose文件
- 9.2 修改linux系统权限
- 9.3 docker-compose部署es集群
- 9.4 集群状态监控
提示
如果虚拟机切换了网络,需要重启docker服务:systemctl restart docker
。
1 注意版本差别
elasticsearch8.x默认开启了ssl认证,导致无法访问9200端口
解决办法:elasticsearch.yml中的配置项xpack.security.enabled把true改为false,或者访问地址前加https://
。
1.1 docker修改配置
1.1.2 docker使用vim报命令不存在的解决办法
apt-get update
apt-get install vim
1.1.3 docker 容器内报错 E: List directory /var/lib/apt/lists/partial is missing. - Acquire ( : No such file or directory) 或者其他权限 PermissionError: [Errno 13] Permission denied:
docker exec -it 容器id /bin/bash
改为
docker exec -u 0 -it 容器id /bin/bash
2 开放端口
- 开放服务器端口
firewall-cmd --zone=public --add-port=9200/tcp --permanent
- 重启防火墙
firewall-cmd --reload
- 查询有哪些端口是开启的
firewall-cmd --list-port
3 docker创建网络
因为我们还需要部署kibana容器,因此需要让es和kibana容器互联。这里先创建一个网络:
docker network create es-net
4 docker部署elasticsearch单机版
4.1 创建存储elasticsearch配置的目录
/opt/soft/docker/elasticsearch/elastic
4.2 创建临时es节点
创建临时节点用于后续将es里的配置拷贝到/opt/soft/docker/elasticsearch/elastic
docker run -d \
--name es \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
-e "discovery.type=single-node" \
-p 9200:9200 \
-p 9300:9300 \
elasticsearch:8.11.0
4.3 拷贝es配置
将临时es节点中的配置拷贝到/opt/soft/docker/elasticsearch/elastic中
docker cp -a es:/usr/share/elasticsearch/config/ /opt/soft/docker/elasticsearch/elastic
docker cp -a es:/usr/share/elasticsearch/data/ /opt/soft/docker/elasticsearch/elastic
docker cp -a es:/usr/share/elasticsearch/logs/ /opt/soft/docker/elasticsearch/elastic
docker cp -a es:/usr/share/elasticsearch/plugins/ /opt/soft/docker/elasticsearch/elastic
前面是es容器中的地址,后面是物理服务器上的地址。
拷贝后将临时es节点的容器删除。
4.4 创建真实的es节点
创建真实的es节点,并将物理节点上的配置映射到容器内。
docker run -d \
--name es \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
-e "discovery.type=single-node" \
-v /opt/soft/docker/elasticsearch/elastic/config/:/usr/share/elasticsearch/config \
-v /opt/soft/docker/elasticsearch/elastic/data:/usr/share/elasticsearch/data \
-v /opt/soft/docker/elasticsearch/elastic/logs:/usr/share/elasticsearch/logs \
-v /opt/soft/docker/elasticsearch/elastic/plugins:/usr/share/elasticsearch/plugins \
--privileged \
--network es-net \
-p 9200:9200 \
-p 9300:9300 \
elasticsearch:8.11.0
命令解释:
-e "cluster.name=es-docker-cluster"
:设置集群名称-e "http.host=0.0.0.0"
:监听的地址,可以外网访问-e "ES_JAVA_OPTS=-Xms512m -Xmx512m"
:内存大小-e "discovery.type=single-node"
:非集群模式-v es-data:/opt/soft/docker/elasticsearch/elastic/data
:挂载逻辑卷,绑定到es的数据目录-v es-logs:/opt/soft/docker/elasticsearch/elastic/logs
:挂载逻辑卷,绑定到es的日志目录-v es-plugins:/opt/soft/docker/elasticsearch/elastic/plugins
:挂载逻辑卷,绑定到es的插件目录--privileged
:授予逻辑卷访问权--network es-net
:加入一个名为es-net的网络中-p 9200:9200
:端口映射配置
4.5 浏览器访问ip:9200
因为elasticsearch8.x默认开启了ssl认证,导致无法通过http协议访问9200端口。
解决办法:elasticsearch.yml中的配置项xpack.security.enabled把true改为false,或者访问地址前加https://
。
4.5.1 关闭安全验证
去/opt/soft/docker/elasticsearch/elastic/config
修改elasticsearch.yml中的配置项xpack.security.enabled
把true改为false即可,然后重启容器。
{
"name" : "3e3f8ad3b0f4",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "0Aacm9CyQw-CFKp3uJ7Yjg",
"version" : {
"number" : "8.11.0",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "d9ec3fa628c7b0ba3d25692e277ba26814820b20",
"build_date" : "2023-11-04T10:04:57.184859352Z",
"build_snapshot" : false,
"lucene_version" : "9.8.0",
"minimum_wire_compatibility_version" : "7.17.0",
"minimum_index_compatibility_version" : "7.0.0"
},
"tagline" : "You Know, for Search"
}
4.5.2 将https改为http
去/opt/soft/docker/elasticsearch/elastic/config
修改elasticsearch.yml中的配置项xpack.security.http.ssl.enabled
把true改为false即可,然后重启容器。
用户名:elastic
密码:
4.5.3 重置es密码
- 进入es容器
docker exec -it 容器id /bin/bash
或【有root权限】
docker exec -u 0 -it 容器id /bin/bash
- 重置es密码
./bin/elasticsearch-reset-password -u elastic
- 重置结果
This tool will reset the password of the [elastic] user to an autogenerated value.
The password will be printed in the console.
Please confirm that you would like to continue [y/N]y
Password for the [elastic] user successfully reset.
New value: g=dCSssbBYwal14pTPRf
es账号:elastic
密码:g=dCSssbBYwal14pTPRf
4.6 es添加其他用户
- 进入es容器
docker exec -it 容器id /bin/bash
或【有root权限】
docker exec -u 0 -it 容器id /bin/bash
4.6.1 添加kibana_system用户
- 添加kibana_system用户
./bin/elasticsearch-users useradd zhyqin
输入密码:kibana123456
2. zhyqin赋角色权限: 这一步要执行,不然无法访问
./bin/elasticsearch-users roles -a superuser zhyqin ( 超级管理员角色)
./bin/elasticsearch-users roles -a kibana_system zhyqin (kibana的用户角色 )
4.6.2 添加logstash用户
- 添加logstash用户
./bin/elasticsearch-users useradd logstash_zhyqin
输入密码:logstash123456
- logstash_zhyqin赋角色权限: 这一步要执行,不然无法访问
./bin/elasticsearch-users roles -a superuser logstash_zhyqin
./bin/elasticsearch-users roles -a logstash_system logstash_zhyqin
4.6.3 重置用户密码
./bin/elasticsearch-reset-password -u zhyqin
./bin/elasticsearch-reset-password -u logstash_zhyqin
5 kibana
5.1 创建存储kibana配置的目录
/opt/soft/docker/elasticsearch/kibana/
5.2 创建临时kibana节点
创建临时节点用于后续将kibana里的配置拷贝到/opt/soft/docker/elasticsearch/kibana
docker run -d \
--name kibana \
-p 5601:5601 \
kibana:8.11.0
5.3 拷贝kibana配置
将临时kibana节点中的配置拷贝到/opt/soft/docker/elasticsearch/kibana中
docker cp -a kibana:/usr/share/kibana/config/ /opt/soft/docker/elasticsearch/kibana
前面是kibana容器中的地址,后面是物理服务器上的地址。
拷贝后将临时kibana节点的容器删除。
5.4 创建真实kibana节点
kibana可以给我们提供一个elasticsearch的可视化界面,便于我们学习。
注意kibana的版本最好和es保持一致。
docker run -d \
--name kibana \
-e ELASTICSEARCH_HOSTS=http://es:9200 \
-v /opt/soft/docker/elasticsearch/kibana/config:/usr/share/kibana/config \
--network=es-net \
-p 5601:5601 \
kibana:8.11.0
--network es-net
:加入一个名为es-net的网络中,与elasticsearch在同一个网络中-e ELASTICSEARCH_HOSTS=http://es:9200"
:设置elasticsearch的地址,因为kibana已经与elasticsearch在一个网络,因此可以用容器名直接访问elasticsearch-p 5601:5601
:端口映射配置
kibana启动一般比较慢,需要多等待一会,然后在浏览器输入地址访问:ip:5601,即可看到结果如下图:
5.5 加入es登录的账号密码
去/opt/soft/docker/elasticsearch/kibana/config修改kibana.yml中添加账号密码。
注意:这里不能直接使用elastic账号密码,因为这个权限太高,kibana默认禁止使用。
#
# ** THIS IS AN AUTO-GENERATED FILE **
#
# Default Kibana configuration for docker target
server.host: "0.0.0.0"
server.shutdownTimeout: "5s"
elasticsearch.hosts: [ "http://elasticsearch:9200" ]
# es登录账号
elasticsearch.username: zhyqin
# es登录密码
elasticsearch.password: kibana123456
# 关闭浏览器端配置
xpack.screenshotting.browser.chromium.disableSandbox: true
monitoring.ui.container.elasticsearch.enabled: true
然后重启容器。
5.6 Dev Tools
kibana中提供了一个Dev Tools界面:这个界面中可以编写DSL来操作elasticsearch。并且对DSL语句有自动补全功能。
Dev Tools在左侧,侧边栏的最下边。
6 安装IK分词器
6.1 在线安装ik插件(较慢)
# 进入容器内部
docker exec -it es/bin/bash
# 在线下载并安装
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v8.11.0/elasticsearch-analysis-ik-8.11.0.zip
#退出
exit
#重启容器
docker restart es
6.2 离线安装ik插件(推荐)
- 解压缩分词器安装包
去GitHub下载ik分词器并解压缩,重命名为ik。elasticsearch-analysis-ik-8.11.0.zip下载地址。 - 上传到es容器的plugins数据卷中,也就是:
/opt/soft/docker/elasticsearch/elastic/plugins/
,注意plugins目录只能保留ik,不要留存ik.zip,否则会报错。 - 重启容器
# 重启容器 docker restart es # 查看es日志 docker logs -f es
6.3 测试
IK分词器包含两种模式:
- ik_smart:最少切分
- ik_max_word:最细切分
GET /_analyze
{
"text": "强哥最棒",
"analyzer": "ik_max_word"
}
结果:
{
"tokens": [
{
"token": "强",
"start_offset": 0,
"end_offset": 1,
"type": "CN_CHAR",
"position": 0
},
{
"token": "哥",
"start_offset": 1,
"end_offset": 2,
"type": "CN_CHAR",
"position": 1
},
{
"token": "最",
"start_offset": 2,
"end_offset": 3,
"type": "CN_CHAR",
"position": 2
},
{
"token": "棒",
"start_offset": 3,
"end_offset": 4,
"type": "CN_CHAR",
"position": 3
}
]
}
7 扩展词词典、停用词词典
7.1 扩展词词典
随着互联网的发展,“造词运动”也越发的频繁。出现了很多新的词语,在原有的词汇列表中并不存在。比如:“奥力给”,“字节跳动” 等。
所以我们的词汇也需要不断的更新,IK分词器提供了扩展词汇的功能。
- 打开IK分词器config目录
- 在IKAnalyzer.cfg.xml配置文件内容添加:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <comment>IK Analyzer 扩展配置</comment> <!--用户可以在这里配置自己的扩展字典 --> <entry key="ext_dict">ext.dic</entry> <!--用户可以在这里配置自己的扩展停止词字典--> <entry key="ext_stopwords"></entry> <!--用户可以在这里配置远程扩展字典 --> <!-- <entry key="remote_ext_dict">words_location</entry> --> <!--用户可以在这里配置远程扩展停止词字典--> <!-- <entry key="remote_ext_stopwords">words_location</entry> --> </properties>
- 新建一个ext.dic,可以参考config目录下复制一个配置文件进行修改
字节跳动 奥力给
- 重启elasticsearch
docker restart es
# 查看 日志
docker logs -f es
日志中已经成功加载ext.dic配置文件。
- 测试效果
GET /_analyze { "analyzer": "ik_max_word", "text": "字节跳动是全球厉害的独角兽企业,奥力给!" }
7.2 停用词词典
在互联网项目中,在网络间传输的速度很快,所以很多语言是不允许在网络上传递的,如:关于宗教、政治等敏感词语,那么我们在搜索时也应该忽略当前词汇。
IK分词器也提供了强大的停用词功能,让我们在索引时就直接忽略当前的停用词汇表中的内容。
- IKAnalyzer.cfg.xml配置文件内容添加:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict">ext.dic</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords">stopword.dic</entry>
<!--用户可以在这里配置远程扩展字典 -->
<!-- <entry key="remote_ext_dict">words_location</entry> -->
<!--用户可以在这里配置远程扩展停止词字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
- 在stopword.dic添加停用词
吴某凡
- 重启elasticsearch
# 重启服务 docker restart es # 查看 日志 docker logs -f es
日志中已经成功加载stopword.dic配置文件。
4. 测试效果:
GET /_analyze
{
"analyzer": "ik_max_word",
"text": "吴某凡判多久"
}
8 部署docker-compose
- cd到
/usr/local/bin/
路径 - 从github上下载二进制文件
wget https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-linux-x86_64
- 重新命名
mv docker-compose-linux-x86_64 docker-compose
- 添加可执行权限
chmod +x docker-compose
8.1 dockr-compose命令
- 部署一个Compose应用
默认情况下该命令会读取名为docker-compose up
docker-compose.yml
或docker-compose.yaml
的文件,也可以使用-f
指定其他文件名。通常情况下,会使用-d
参数令应用在后台启动。 - 停止Compose应用相关的所有容器,但不会删除它们
被停止的应用可以很容易地通过docker-compose stop
docker-compose restart
命令重新启动。 - 删除已停止的Compose应用
删除容器和网络,但是不会删除卷和镜像。docker-compose rm
- 重启已停止的Compose应用
如果在停止该应用后对其进行了变更,那么变更的内容不会反映在重启后的应用中,这时需要重新部署应用使变更生效。docker-compose restart
- 列出Compose应用中的各个容器
输出内容包括当前状态、容器运行的命令以及网络端口。docker-compose ps
- 停止并删除运行中的Compose应用
删除容器和网络,但是不会删除卷和镜像。docker-compose down
9 部署es集群
参考1:搜索引擎elasticsearch :安装elasticsearch (包含安装组件kibana、IK分词器、部署es集群)
参考2:docker-compose快速部署elasticsearch-8.x集群+kibana
部署es集群可以直接使用docker-compose来完成,不过要求Linux虚拟机至少有4G的内存空间。
9.1 编写docker-compose文件
首先编写一个docker-compose文件,内容如下:
version: '3'
services:
es01:
image: elasticsearch:8.11.0
container_name: es01
environment:
- node.name=es01
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es02,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- xpack.security.enabled=false
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data01:/usr/share/elasticsearch/data
ports:
- 9201:9200
networks:
- elastic
es02:
image: elasticsearch:8.11.0
container_name: es02
environment:
- node.name=es02
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- xpack.security.enabled=false
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data02:/usr/share/elasticsearch/data
ports:
- 9202:9200
networks:
- elastic
es03:
image: elasticsearch:8.11.0
container_name: es03
environment:
- node.name=es03
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es02
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- xpack.security.enabled=false
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data03:/usr/share/elasticsearch/data
ports:
- 9203:9200
networks:
- elastic
volumes:
data01:
driver: local
data02:
driver: local
data03:
driver: local
networks:
elastic:
driver: bridge
注意事项:
- 从yml文件中可以看到相关端口,需要防火墙开放9201、9202、9203端口:
es01端口9201 es02端口9202 es03端口9203
- 此配置关闭了安全验证,也就是
- xpack.security.enabled=false
,否则会报如下错误
Transport SSL must be enabled if security is enabled. Please set [xpack.security.transport.ssl.enabled] to [true] or disable security by setting [xpack.security.enabled] to [false];
- 或者将
- xpack.security.enabled=false
替换为- xpack.security.transport.ssl.enabled=true
(暂未实践)
需要加入ssl证书相关配置。(docker-compose快速部署elasticsearch-8.x集群+kibana) - 上传到
/opt/soft/docker-compose/
9.2 修改linux系统权限
- es运行还需要修改一些linux系统权限,修改
/etc/sysctl.conf
文件。
添加下面的内容:vim /etc/sysctl.conf
否则在部署时会报:vm.max_map_count=262144
node validation exception\n[2] bootstrap checks failed. You must address the points described in the following [2] lines before starting Elasticsearch. For more information see [https://www.elastic.co/guide/en/elasticsearch/reference/8.11/bootstrap-checks.html]\nbootstrap check failure [1] of [2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144];
- 让配置生效:
sysctl -p
- 重启虚拟机和docker
systemctl start docker
9.3 docker-compose部署es集群
-
部署es集群
docker-compose up 或 docker-compose up -d(推荐)
部署结果:
[root@standalone docker-compose]# docker-compose up -d [+] Building 0.0s (0/0) docker:default [+] Running 3/3 ✔ Container es02 Started 0.0s ✔ Container es03 Started 0.1s ✔ Container es01 Started 0.0s [root@standalone docker-compose]#
-
查看每个节点的日志:
docker logs -f es01
docker logs -f es02
docker logs -f es03
9.4 集群状态监控
这里推荐使用cerebro来监控es集群状态,官方网址:https://github.com/lmenezes/cerebro