全文检索示例:构建自己Elasticsearch docker镜像(1)

简介

本文主要介绍如何构建自己的Elasticsearch docker镜像

  • 构建原因
    官方的Elasticsearch docker镜像没有中文分词插件,本章节介绍如何构建一个带有ik分词插件的Elasticsearch docker镜像

  • 环境介绍
    系统:centos7.6 ,IP:192.168.1.14

软件版本
docker1.3.1
docker-compose1.18.0
elasticsearch基础镜像6.8.3
ik插件6.8.3

前置条件

  • 已有Centos7的Docker环境
    本文基于Centos7的Docker进行演示,如果没有Centos7的Docker环境,可以参照Centos7.6安装Docker
  • 已有Nginx或Apache环境
    IK自定义词典需要放到web服务器中,用于实现词典热加载。
    另外构建镜像时,将IK插件放在web服务器上,用于提高安装速度
    本次构建基于当前linux虚拟机中的nginx,安装步骤参见
    使用docker安装nginx

软件准备

目的:将ik插件放到自己的web服务器上,可以通过http://192.168.1.14/soft/elasticsearch-analysis-ik-6.8.3.zip地址下载ik插件包,提高构建镜像时安装插件的速度。

# 安装wget包
yum install -y wget

# 下载分词插件(此处使用wget下载,也可以用浏览器下载后上传到虚拟机中)
wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.8.3/elasticsearch-analysis-ik-6.8.3.zip

#在nginx的root目录(/usr/share/nginx/html)下创建soft文件夹
[root@localhost ~]# mkdir -vp /usr/share/nginx/html/soft
mkdir: 已创建目录 "/usr/share/nginx/html/soft"
# 将插件包移动到soft目录下
[root@localhost ~]# mv elasticsearch-analysis-ik-6.8.3.zip /usr/share/nginx/html/soft
# 如果你跟我一样在192.168.1.14这个机器上用docker装的nginx,需要关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 此时便可以通过http://192.168.1.14/soft/elasticsearch-analysis-ik-6.8.3.zip地址下载ik插件包

IK配置

准备自定义词典

# 在nginx的root目录(/usr/share/nginx/html)下创建ik文件夹
[root@localhost ~]# mkdir -vp /usr/share/nginx/html/ik
mkdir: 已创建目录 "/usr/share/nginx/html/ik"
# 创建自定义词典文件和自定义停用词文件
[root@localhost ~]# touch /usr/share/nginx/html/ik/my_extra.dic
[root@localhost ~]# touch /usr/share/nginx/html/ik/my_stopword.dic
# 验证词典文件可以访问,如果下面两条命令没有任何返回表明nginx启动成功且分词文件(目前无内容)可以访问
[root@localhost ~]# curl http://192.168.1.14/ik/my_extra.dic
[root@localhost ~]# curl http://192.168.1.14/ik/my_stopword.dic

准备配置文件

# 创建构建目录
[root@localhost ~]# mkdir -vp /root/docker-build/elasticsearch/
mkdir: 已创建目录 "/root/docker-build/elasticsearch/"
# 在构建目录下创建ik配置文件
[root@localhost ~]# vim /root/docker-build/elasticsearch/IKAnalyzer.cfg.xml

ik配置文件内容如下,ikserver表示一个域名,当我们启动elasticsearch镜像时将ikserver映射到192.168.1.14,这样做的好处是当我们词典换服务器的时候不用重新构建镜像,修改启动elasticsearch配置文件就可以了

<?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"></entry> -->
    <!--用户可以在这里配置自己的扩展停止词字典
   <entry key="ext_stopwords"></entry>-->
   <!--用户可以在这里配置远程扩展字典 -->
   <entry key="remote_ext_dict">http://ikserver/ik/my_extra.dic</entry>
   <!--用户可以在这里配置远程扩展停止词字典-->
   <entry key="remote_ext_stopwords">http://ikserver/ik/my_stopword.dic</entry>
</properties>

构建镜像

构建镜像需要创建以下文件

  • Dockerfile 指明构建步骤
  • build.sh 执行构建命令

Dockerfile

# 在构建目录下创建Dockerfile文件
[root@localhost ~]# vim /root/docker-build/elasticsearch/Dockerfile

文件内容如下

# 基于es官方提供的镜像构建
FROM docker.elastic.co/elasticsearch/elasticsearch:6.8.3

# ik插件安装
RUN /usr/share/elasticsearch/bin/elasticsearch-plugin install --batch http://192.168.1.14/soft/elasticsearch-analysis-ik-6.8.3.zip
# 添加ik配置文件
ADD ./IKAnalyzer.cfg.xml /usr/share/elasticsearch/config/analysis-ik/IKAnalyzer.cfg.xml

build.sh

# 在构建目录下创建build.sh文件
[root@localhost ~]# vim /root/docker-build/elasticsearch/build.sh

build.sh文件内容

docker build -t huanqingdong/elasticsearch:6.8.3-ik .

-t 后面为tag名称,格式 docker账号/镜像名称:版本
此处docker账号:huanqingdong ,镜像名称:elasticsearch ,版本:6.8.3-ik
最后面一个 . 表示基于当前目录内容构建

执行构建

# 进入构建目录
[root@localhost ~]# cd /root/docker-build/elasticsearch
# 执行构建脚本build.sh
[root@localhost elasticsearch]# sh build.sh 
Sending build context to Docker daemon 4.608 kB
Step 1/3 : FROM docker.elastic.co/elasticsearch/elasticsearch:6.8.3
Trying to pull repository docker.elastic.co/elasticsearch/elasticsearch ... 
6.8.3: Pulling from docker.elastic.co/elasticsearch/elasticsearch
b38629870fdb: Pull complete 
3c0cf3930e47: Pull complete 
27387c4a7b1c: Pull complete 
eb71028b39e7: Pull complete 
5f79cf544a7c: Pull complete 
ab0fbae6b662: Pull complete 
f8e59ec3ec96: Pull complete 
Digest: sha256:9855face4588eda23a69dfada992d0894d64ed06f4549cc5a0b8242415013ba5
Status: Downloaded newer image for docker.elastic.co/elasticsearch/elasticsearch:6.8.3
 ---> 1d0fd79266e6
Step 2/3 : RUN /usr/share/elasticsearch/bin/elasticsearch-plugin install --batch http://192.168.1.14/soft/elasticsearch-analysis-ik-6.8.3.zip
 ---> Running in 848f3d2b25da

-> Downloading http://192.168.1.14/soft/elasticsearch-analysis-ik-6.8.3.zip
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@     WARNING: plugin requires additional permissions     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
* java.net.SocketPermission * connect,resolve
See http://docs.oracle.com/javase/8/docs/technotes/guides/security/permissions.html
for descriptions of what these permissions allow and the associated risks.
-> Installed analysis-ik
 ---> 38fd3895db41
Removing intermediate container 848f3d2b25da
Step 3/3 : ADD ./IKAnalyzer.cfg.xml /usr/share/elasticsearch/config/analysis-ik/IKAnalyzer.cfg.xml
 ---> 40ecc3e5967e
Removing intermediate container 7d557c7be523
Successfully built 40ecc3e5967e

# 查看构建完成的镜像
[root@localhost elasticsearch]# docker images |grep elasticsearch
huanqingdong/elasticsearch                      6.8.3-ik            aaeedbcf3b0f        6 minutes ago       814 MB
docker.elastic.co/elasticsearch/elasticsearch   6.8.3               1d0fd79266e6        6 weeks ago         800 MB

可能出现的异常

-> Downloading http://192.168.1.14/soft/elasticsearch-analysis-ik-6.8.3.zip
Exception in thread "main" java.net.NoRouteToHostException: No route to host (Host unreachable)
	at java.base/java.net.PlainSocketImpl.socketConnect(Native Method)
	at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399)
	at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242)
	at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224)
	at java.base/java.net.Socket.connect(Socket.java:591)
	at java.base/java.net.Socket.connect(Socket.java:540)
	at java.base/sun.net.NetworkClient.doConnect(NetworkClient.java:182)
	at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:474)
	at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:569)
	at java.base/sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
	at java.base/sun.net.www.http.HttpClient.New(HttpClient.java:341)
	at java.base/sun.net.www.http.HttpClient.New(HttpClient.java:362)
	at java.base/sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1248)
	at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1187)
	at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1081)
	at java.base/sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:1015)
	at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1587)
	at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1515)
	at org.elasticsearch.plugins.InstallPluginCommand.downloadZip(InstallPluginCommand.java:379)
	at org.elasticsearch.plugins.InstallPluginCommand.download(InstallPluginCommand.java:278)
	at org.elasticsearch.plugins.InstallPluginCommand.execute(InstallPluginCommand.java:229)
	at org.elasticsearch.plugins.InstallPluginCommand.execute(InstallPluginCommand.java:216)
	at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86)
	at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124)
	at org.elasticsearch.cli.MultiCommand.execute(MultiCommand.java:77)
	at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124)
	at org.elasticsearch.cli.Command.main(Command.java:90)
	at org.elasticsearch.plugins.PluginCli.main(PluginCli.java:47)

处理方式,关闭nginx所在服务器的防护墙

systemctl stop firewalld
systemctl disable firewalld
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值