Docker中使用elasticsearch

发布时间 2023-11-23 15:24:54作者: yysocket

Docker中使用elasticsearch

1、docker拉取elasticsearch:7.17镜像

这里我们拉取7.17.10版本:docker pull elasticsearch:7.17.10

2、创建自己的配置文件并写入基础数据供后续挂载后直接启动使用

【非必选,在不指定挂载配置文件启动的情况下可不设置】

创建文件夹后,新建一个自己的elasticsearch.yml文件,并给与最基础的设置。
如果需要更多的设置,比如集群设置,则需要在遵循elasticsearch规则的基础上配置elasticsearch.yml文件

mkdir -p /usr/local/es7.17.10/config
mkdir -p /usr/local/es7.17.10/data
mkdir -p /usr/local/es7.17.10/plugins
echo "cluster.name: \"docker-es-cluster\"" >> /usr/local/es7.17.10/config/elasticsearch.yml
echo "http.host: 0.0.0.0" >> /usr/local/es7.17.10/config/elasticsearch.yml

3、修改外部宿主机的挂载文件夹权限【非必选,在不指定挂载配置文件的情况下可不设置】

由于docker内访问映射文件权限的问题,所以需要修改es文件夹的权限属性。

chmod -R 777 /usr/local/es7.17.10

4、启动elasticsearch容器

4.1 单节点启动

不需要es集群的情况下,可以选择单节点启动,docker下的es的最简单的默认配置不用修改,可以直接单节点启动。

启动代码如下:

docker run --name es7.17 --privileged=true -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -e TZ='Asia/Shanghai' -e LANG="en_US.UTF-8" -d elasticsearch:7.17.10

启动代码分析:

docker run 
--name es7.17                                  //容器名字
--privileged=true                              //使docker容器的root拥有更大的权限,近乎于宿主机的root权限,便于容器内部操作宿主机系统文件和功能 
-p 9200:9200                                   //端口映射 
-p 9300:9300                                   //端口映射
-e "discovery.type=single-node"                //单节点启动,此模式下不可设置节点名称 
-e ES_JAVA_OPTS="-Xms512m -Xmx512m"            //容器的java虚拟机内存配置
-e TZ='Asia/Shanghai'                          //时区配置
-e LANG="en_US.UTF-8"                          //编码
-d elasticsearch:7.17.10                       //后台启动后跟镜像名

4.2 集群方式启动

集群方式启动,需要单独配置elasticsearch.yml文件。需要用到外部挂载的方式来配置我们自己的elasticsearch.yml文件,并告诉docker的elasticsearch启动加载的elasticsearch.yml路径。

  1. 简单启动一个es容器,然后复制出容器中的配置文件到宿主机的挂载目录下

    docker run --name es7.17-demo --privileged=true -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -e TZ='Asia/Shanghai' -e LANG="en_US.UTF-8" -d elasticsearch:7.17.10
    docker cp es7.17-demo:/usr/share/elasticsearch/config /usr/local/es7.17.10/
    docker cp es7.17-demo:/usr/share/elasticsearch/data /usr/local/es7.17.10/
    docker cp es7.17-demo:/usr/share/elasticsearch/plugins /usr/local/es7.17.10/
    chmod 777 -R es7.17.10/
    
  2. 修改挂载目录下的elasticsearch.yml文件为自己的配置

    # ===== Elasticsearch Configuration =====
    #
    # 集群设置
    #
    # Use a descriptive name for your cluster:
    # 集群名
    cluster.name: elasticsearch
    #
    # 节点配置
    # -------- Node ---------
    #
    # Use a descriptive name for the node:
    # 节点名
    node.name: node-1
    #
    #
    # ------- Network -------
    #
    # Set the bind address to a specific IP (IPv4 or IPv6):
    # 绑定的本机的ip地址
    network.host: 0.0.0.0
    #
    # Set a custom port for HTTP:
    #
    http.port: 9200
    transport.tcp.port: 9300
    #
    # For more information, consult the network module documentation.
    # 节点发现模式配置,用于集群管理
    # ----- Discovery -----
    #
    # discovery.seed_hosts是一种列出集群中候选主节点地址,格式为IP:port
    # discovery.seed_hosts: ["host1:port", "host2:port"]
    #
    # initial_master_nodes仅在集群首次启动会使用,列出初始候选主节点的名称,后续启动可以不需要
    cluster.initial_master_nodes: ["node-1"]
    #
    #
    http.cors.enabled: true
    http.cors.allow-origin: '*'
    bootstrap.system_call_filter: false
    
  3. 通过宿主机的挂载目录config文件启动容器
    挂载后,内部的yml文件便是我们编辑过的自定义配置文件。

docker stop es7.17-demo
docker rm es7.17-demo
docker run --name es7.17 --privileged=true -p 9200:9200 -p 9300:9300 -v /usr/local/es7.17.10/config:/usr/share/elasticsearch/config -v /usr/local/es7.17.10/data:/usr/share/elasticsearch/data -v /usr/local/es7.17.10/plugins:/usr/share/elasticsearch/plugins -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -e TZ='Asia/Shanghai' -e LANG="en_US.UTF-8" -d elasticsearch:7.17.10

5、报错处理

5.1 启动后报错:Exited (78) 19 seconds ago

查看log如下:

ERROR: [1] bootstrap checks failed. You must address the points described in the following [1] lines before starting Elasticsearch.
bootstrap check failure [1] of [1]: 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

翻译过来就是:导程序检查失败:默认发现设置不适合生产使用;必须至少配置[discovery.seed_hosts、discovery.seed_providers、cluster.initial_master_nodes]中的一个

elasticsearch默认是集群启动,如果没有加-e "discovery.type=single-node"会报错。
这是因为Elasticsearch 7.x 集群的话必须制定节点的发现方式或初始化节点列表:

  • discovery.seed_hosts: 列出集群中候选主节点地址,格式为IP:port。
    设置如下:discovery.seed_hosts: ["172.168.10.111:9300", "172.168.10.112:9300"]

  • discovery.seed_providers: 以文件的方式提供出候选主节点列表,可以动态加载,格式为文件名。
    设置如下:discovery.seed_providers: file

  • cluster.initial_master_nodes: 仅在集群首次启动会使用,列出初始候选主节点的名称,后续启动可以不需要。
    设置如下:cluster.initial_master_nodes: ["node1", "node2"]