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路径。
-
简单启动一个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/
-
修改挂载目录下的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
-
通过宿主机的挂载目录config文件启动容器
挂载后,内部的yml文件便是我们编辑过的自定义配置文件。
通过docker命令启动容器。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"]