1.创建文件夹
mkdir es
cd es
mkdir dockerfile #镜像构建目录
mkdir shell 构建镜像、运行容器相关脚本
mkdir volumes 挂载文件所在目录,一般包括日志、配置、持久化数据
2.准备构建镜像所需要的的三个分词器 analysis-ik-7.4.2.zip analysis-pinyin-7.4.2.zip elasticsearch-analysis-ansj-7.4.2.0-release.zip
3.创建Dockerfile文件
cd dockerfile
vim Dokcerfile
添加下面的内容
FROM elasticsearch:7.4.2
#author
MAINTAINER mfw
ENV ES_PLUGINS_PATH /usr/share/elasticsearch/plugins
ENV ES_PLUGINS_IK_PATH /usr/share/elasticsearch/plugins/ik
ENV ES_PLUGINS_PINYIN_PATH /usr/share/elasticsearch/plugins/pinyin
ENV ES_PLUGINS_ANSJ_PATH /usr/share/elasticsearch/plugins/ansj
COPY analysis-ik-7.4.2.zip /home/
COPY analysis-pinyin-7.4.2.zip /home/
COPY elasticsearch-analysis-ansj-7.4.2.0-release.zip /home/
RUN yum -y install unzip && mkdir -p $ES_PLUGINS_PATH && mkdir -p $ES_PLUGINS_IK_PATH && mv /home/analysis-ik-7.4.2.zip $ES_PLUGINS_IK_PATH && cd $ES_PLUGINS_IK_PATH && unzip *.zip && rm -rf *.zip && mv $ES_PLUGINS_IK_PATH/analysis-ik-7.4.2/* ./ && rm -rf $ES_PLUGINS_IK_PATH/analysis-ik-7.4.2 && mkdir -p $ES_PLUGINS_PINYIN_PATH && mv /home/analysis-pinyin-7.4.2.zip $ES_PLUGINS_PINYIN_PATH && cd $ES_PLUGINS_PINYIN_PATH && unzip *.zip && rm -rf *.zip && mv $ES_PLUGINS_PINYIN_PATH/analysis-pinyin-7.4.2/* ./ && rm -rf $ES_PLUGINS_PINYIN_PATH/analysis-pinyin-7.4.2 && mkdir -p $ES_PLUGINS_ANSJ_PATH && mv /home/elasticsearch-analysis-ansj-7.4.2.0-release.zip $ES_PLUGINS_ANSJ_PATH && cd $ES_PLUGINS_ANSJ_PATH && unzip *.zip && rm -rf *.zip && mv $ES_PLUGINS_ANSJ_PATH/elasticsearch-analysis-ansj-7.4.2.0-release/* ./ && rm -rf $ES_PLUGINS_ANSJ_PATH/elasticsearch-analysis-ansj-7.4.2.0-release
#镜像内置elasticsearch,不需要创建用户
#&& useradd hd && chown -R hd:hd $ES_PLUGINS_PATH && chown -R hd:hd /usr/share/elasticsearch
#使用内置账户
USER elasticsearch
es不支持使用root账户启动 4.创建构建镜像脚本
cd ../shell/
vim build
加入构建脚本
#!/bin/bash
DOCKER_PATH=$PWD/../
sudo docker build -f $DOCKER_PATH/dockerfile/Dockerfile -t elasticsearch-with-ansj-ik-pinyin:7.4.2 $DOCKER_PATH/dockerfile/
赋予执行权限
chmod 755 build
执行
./build
查看镜像
sudo docker images
5.创建容器 创建docker run脚本
vim run
内容如下
#!/bin/sh
DOCKER_PATH=$PWD/../
port=9200
version=7.4.2
imageName=elasticsearch-with-ansj-ik-pinyin
sudo docker run -d -p ${port}:9200 --name es -v /etc/localtime:/etc/localtime -v $DOCKER_PATH/volumes/config/jvm.options:/usr/share/elasticsearch/config/jvm.options -v $DOCKER_PATH/volumes/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v $DOCKER_PATH/volumes/log/:/usr/share/elasticsearch/logs/ -v $DOCKER_PATH/volumes/data/:/usr/share/elasticsearch/data/ --restart=unless-stopped ${imageName}:${version} elasticsearch
执行
./run
6.验证是否启动成功 浏览器访问ip:9200 出现下面信息即为启动成功
挂载的时候可能会出现权限问题 linux验证权限的时候只认uid和gid而不是用户名和组名 如:宿主机上有一个文件夹a要挂载到容器里,在宿主机里文件夹的用户名是hd(uid1000)组是hd(gid1000) 容器里有一个默认用户elasticsearch(uid1000)用户组elasticsearch(gid1000) 还有一个我么自己创建的用户hd(uid1001) 用户组hd(gid1001) 那么宿主机的这个文件夹a挂载到容器内部显示所属用户和组是 elasticsearch 权限问题复现: 宿主机用户hd(uid1000)组是hd(gid1000) 容器内es服务默认用户elasticsearch(uid1000)组是hd(gid1000) Dockerfile中添加容器用户hd(uid1001)组是hd(gid1001)并把容器中的es服务用户和组改为户hd(uid1001)组hd(gid1001) 在不挂载宿主机文件时,容器内使用hd(uid1001)组hd(gid1001)启动es服务是没有权限问题 但在挂载宿主机文件到容器时,宿主机文件权限为hd(uid1000)组是hd(gid1000),映射到容器中,根据uid和gid去判断全新,则挂载的文件在宿主机内是elasticsearch(uid1000)组hd(gid1000),会导致挂载的文件容器内的hd(uid1001)组hd(gid1001)用户没有权限,而容器内用hd用户启动es服务时需要去读取挂载的配置、日志等文件,从而产生没权限的错误
es服务启动遇到的一些警告或问题 OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release. 修改jvm.options配置文件 -XX:+UseConcMarkSweepGC 改为-XX:+UseG1GC
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] 宿主机
sudo vim /etc/sysctl.conf
追加一行
vm.max_map_count=655360
执行
sudo sysctl -p
the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured 修改服务配置
vim /usr/share/elasticsearch/config/elasticsearch.yml
改为以下内容
# 设置节点名字
node.name: node-1
# 设置访问端口
http.port: 9200
# 取消注释:保留一个节点
cluster.initial_master_nodes: ["node-1"]
# 远程连接配置
network.host: 0.0.0.0
http.cors.enabled: true
http.cors.allow-origin: "*"
|