基于Docker的ElasticSearch环境搭建

  • 基础环境(作者自测环境和版本,具体环境可根据实际情况调整)
  • 操作系统

centos7.6

  • Docker

docker 20.10.21

  • ES Docker镜像

docker.elastic.co/elasticsearch/elasticsearch   8.10.1

  • kibana Docker镜像(ES的图像化界面)

docker.elastic.co/kibana/kibana                 8.10.1

  • Docker Compose可以同时管理多个Docker容器,便于快速的部署分布式应用

Docker Compose v2.26.0

  • Elasticvue是MicrosoftEdge提供的插件,用于Elasticsearch的免费开源gui

https://microsoftedge.microsoft.com/addons/detail/elasticvue/geifniocjfnfilcbeloeidajlfmhd

https://github.com/infinilabs/analysis-ik

  • 操作系统配置
  • 内核设置必须设置为vm.max_map_count262144

1)用编辑工具打开文件/etc/sysctl.conf
2)在尾部添加一行配置vm.max_map_count = 262144,如果已存在就修改,数值不能低于262144
3)修改保存,然后执行命令sudo sysctl -p使其立即生效单节点安装

  • 单节点安装
  • 配置挂载数据文件夹

mkdir -p /home/es/es11/data

mkdir -p /home/es/es11/logs

mkdir -p /home/es/es11/plugins

chmod -R 777 /home/es/es11

  • 创建新的docker网络

docker network create single_elastic –subnet 172.121.0.0/16 –gateway 172.121.0.1

  • 启动Elasticsearch

docker run \

–name es11 \

-p 9210:9200 \

-e ES_JAVA_OPTS=”-Xms1024m -Xmx1024m” \

–net single_elastic \

-v /home/es/es11/data:/usr/share/elasticsearch/data \

-v /home/es/es11/plugins:/usr/share/elasticsearch/plugins \

-v /home/es/es11/logs:/usr/share/elasticsearch/logs \

-d docker.elastic.co/elasticsearch/elasticsearch:8.10.1

  • 复制生成的密码和注册令牌。这些凭据仅在首次启动Elasticsearch时显示。可以使用以下命令重新生成凭据

docker exec -it es11 /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic

【随机密码:-u elastic    指定密码:-u elastic -i】

docker exec -it es11 /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana

  • 访问 https://IP:9210 看到返回的 json 数据说明启动成功
  • 默认生成的配置文件

/usr/share/elasticsearch/config/elasticsearch.yml

《基于Docker的ElasticSearch环境搭建》
  • 添加更多节点
  • 使用现有节点为新节点生成注册令牌

docker exec -it es11 /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s node

  • 启动一个新的 Elasticsearch 容器。将注册令牌作为环境变量包括在内

docker run -e ENROLLMENT_TOKEN=”<token>” –name es12 *******【参考第三步】

【用这种方式添加的节点,重启容器会报错,因为重启后还是包含ENROLLMENT_TOKEN的环境变量,需要清一下】

《基于Docker的ElasticSearch环境搭建》
  1. 找到容器目录

docker inspect es12 | grep ResolvConfPath

  • 停止docker服务

systemctl stop docker

  • 找到 resolv.conf 同级目录下的 config.v2.json 并移除其文件中的”ENROLLMENT_TOKEN” key
  • 启动docker服务

systemctl start docker

  • 重启相关容器

【可以把配置文件拷贝到宿主机,再绑定宿主机和容器的配置文件(宿主机文件挂载到容器),再修改config.v2.json的MountPoints和hostconfig.json的Binds,添加挂载点,方便编辑修改配置文件】
docker挂载相关内容可参考:关于 Docker volume 挂载时文件或文件夹不存在的问题 – 博雅空间-520的个人博客 (zby520.com)

【应该可以先启动容器,再手动把该节点添加到集群,未测试】

《基于Docker的ElasticSearch环境搭建》

【还有一个问题,当有新节点加入集群,要修改一下所有节点的配置文件】

  1. 第一个节点注释掉cluster.initial_master_nodes: [“********”]
  2. 所有节点修改discovery.seed_hosts,写入当前所有节点的ip和通信端口写入,示例:

discovery.seed_hosts: [“172.121.0.2:9300”, “172.121.0.3:9300”, “172.121.0.4:9300”]

  • 调用 cat node API 以验证节点是否已添加到集群中

curl -k -u elastic:password https://ip:9210/_cat/nodes

  • 集群安装(使用Docker Compose)

【需要手动配置es的配置文件(配置文件放到对应的挂载数据文件夹里),配来配去的好麻烦,不同版本的es配置还不兼容,目前实现了一个没有安全认证(http的,也没密码)的,先不管了】

  1. docker-compose命令
  2. 启动 docker-compose up -d
  3. 停止 docker-compose stop
  4. 删除 docker-compose down -v
  5. docker-compose配置文件docker-compose.yml,其中一些变量可以在配置文件的同级目录下生成.env文件指定
  6. docker-compose.yml

version: ‘3’

services:

  es01:

    image: ${image}

    container_name: es01

    environment:

      – “ES_JAVA_OPTS=-Xms512m -Xmx512m”   

    ulimits:

      memlock:

        soft: -1

        hard: -1

    volumes:

      – /home/es/es01/data:/usr/share/elasticsearch/data

      – /home/es/es01/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml

      – /home/es/es01/plugins:/usr/share/elasticsearch/plugins

      – /home/es/es01/log:/usr/share/elasticsearch/log

    ports:

      – 9200:9200

      – 9300:9300

    networks:

      – elastic

  es02:

    image: ${image}

    container_name: es02

    environment:

      – “ES_JAVA_OPTS=-Xms512m -Xmx512m”

    ulimits:

      memlock:

        soft: -1

        hard: -1

    volumes:

      – /home/es/es02/data:/usr/share/elasticsearch/data

      – /home/es/es02/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml

      – /home/es/es02/plugins:/usr/share/elasticsearch/plugins

      – /home/es/es02/log:/usr/share/elasticsearch/log

    ports:

      – 9201:9201

      – 9301:9301

    networks:

      – elastic

  es03:

    image: ${image}

    container_name: es03

    environment:

      – “ES_JAVA_OPTS=-Xms512m -Xmx512m”

    ulimits:

      memlock:

        soft: -1

        hard: -1

    volumes:

      – /home/es/es03/data:/usr/share/elasticsearch/data

      – /home/es/es03/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml

      – /home/es/es03/plugins:/usr/share/elasticsearch/plugins

      – /home/es/es03/log:/usr/share/elasticsearch/log

    ports:

      – 9202:9202

      – 9302:9302

    networks:

      – elastic

  kibana:

    image: ${image_kibana}

    container_name: kibana

    depends_on:

      – es01

    volumes:

      – /home/es/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml

    networks:

      – elastic

    ports:

      – 5601:5601

networks:

  elastic:

    external: true

  • .env

image=docker.elastic.co/elasticsearch/elasticsearch:8.10.1

image_kibana=docker.elastic.co/kibana/kibana:8.10.1

  • elasticsearch.yml

#集群名称

cluster.name: es_cluster

#当前该节点的名称

node.name: es01

#是不是有资格竞选主节点

#node.master: true

#是否存储数据

#node.data: true

node.roles: [data, master]

#最大集群节点数

#node.max_local_storage_nodes: 3

#给当前节点自定义属性(可以省略)

#node.attr.rack: r1

#数据存档位置

path.data: /usr/share/elasticsearch/data

#日志存放位置

path.logs: /usr/share/elasticsearch/log

#是否开启时锁定内存(默认为是)

#bootstrap.memory_lock: true

#设置网关地址,我是被这个坑死了,这个地址我原先填写了自己的实际物理IP地址,

#然后启动一直报无效的IP地址,无法注入9300端口,这里只需要填写0.0.0.0

network.host: 0.0.0.0

#设置其它结点和该结点交互的ip地址,如果不设置它会自动判断,值必须是个真实的ip地址,设置当前物理机地址,

#如果是docker安装节点的IP将会是配置的IP而不是docker网管ip

network.publish_host: 10.10.16.20

#设置映射端口

http.port: 9200

#内部节点之间沟通端口

#transport.tcp.port: 9300

transport.port: 9300

#集群发现默认值为127.0.0.1:9300,如果要在其他主机上形成包含节点的群集,如果搭建集群则需要填写

#es7.x 之后新增的配置,写入候选主节点的设备地址,在开启服务后可以被选为主节点,也就是说把所有的节点都写上

discovery.seed_hosts: [“10.10.16.20:9300″,”10.10.16.20:9301″,”10.10.16.20:9302”]

#当你在搭建集群的时候,选出合格的节点集群,有些人说的太官方了,

#其实就是,让你选择比较好的几个节点,在你节点启动时,在这些节点中选一个做领导者,

#如果你不设置呢,elasticsearch就会自己选举,这里我们把三个节点都写上

cluster.initial_master_nodes: [“es01″,”es02″,”es03”]

#在群集完全重新启动后阻止初始恢复,直到启动N个节点

#简单点说在集群启动后,至少复活多少个节点以上,那么这个服务才可以被使用,否则不可以被使用,

#gateway.recover_after_nodes: 2

gateway.recover_after_data_nodes: 2

#删除索引是是否需要显示其名称,默认为显示

#action.destructive_requires_name: true

#下面这个默认为true,就要配置一些安全认证的东西(没细研究),关掉它就可以正常起容器了,密码都不需要。

xpack.security.enabled: false

  • 安装IK分词器
  • 进入每一个es节点plugins对应的挂载目录下
  • 拷贝elasticsearch-analysis-ik-8.11.0.zip,并解压

unzip elasticsearch-analysis-ik-8.11.0.zip -d ik

  • 删除elasticsearch-analysis-ik-8.11.0.zip
  • 修改访问权限

chmod -R 777 ik

  • 修改ik/plugin-descriptor.properties,把里面的8.11.0改成8.10.1,有两处
  • 重启容器
  • 安装kibana
  • 启动kibana

docker run -d –name kib11 –net single_elastic -p 5611:5601 docker.elastic.co/kibana/kibana:8.10.1

  • web登录http://ip:5611
  • 输入上面elasticsearch生成的注册令牌(有效期30分钟)
  • 输入验证码,验证码从kibana的日志中获取,或通过命令重新生成

docker exec -it kib11 /usr/share/kibana/bin/kibana-verification-code

  • 如果页面卡在completing setup那,一直转圈圈,直接刷新页面就行,可以进入登陆界面,目测没啥影响
  • 默认生成的配置文件
《基于Docker的ElasticSearch环境搭建》
  • 配置中文

在配置文件添加i18n.locale: “zh-CN”