为了数据的安全性,需要配置至少2个节点的集群来保证主备节点。 另外,为了保证数据的安全性,和减少镜像大小,需要将elasticsearch的数据保存在宿主机目录下。 所以先创建目录,挂载到容器之后,修改镜像的启动命令。(不需要再开放端口) docker run -it  .... -v <宿主机目录>:<容器目录> <image_id> "/bin/bash"

如下. 这里我们设置elk1为主节点

docker run -itd --privileged=true -p 9300:9300 -p 9200:9200 -p
5601:5601 --name elk1 -v /opt/elk/node1:/opt/elk <image_id>
/usr/sbin/init

docker run -itd --privileged=true --name elk2 -v
/opt/elk/node2:/opt/elk <image_id> /usr/sbin/init

将目录挂载到容器之后中, 修改索引数据和日志数据的存储位置, 修改节点和集群配置,避免因为超时时间过短无法发现集群导致自己选举自己为master。导致集群中存在多个master(脑裂) 修改 elasticsearch.yml

# file: elasticsearch.yml 
path.data: <上面挂载的容器目录>/data
path.logs: <上面挂载的容器目录>/logs
cluster.name: <集群名字>
node.name: <节点名字>
discovery.zen.minimum_master_nodes: 2 # 至少两个节点
discovery.zen.ping_timeout: 3s
client.transport.ping_timeout: 3s
discovery.zen.ping.unicast.hosts: [<节点ip>, <节点ip>]
bootstrap.memory_lock: true # 锁住内存防止内存交换

同时需要修改 jvm 设置文件, 设置jvm堆内存的最大值和最小值 -Xms512m -Xmx512m 修改配置的最大映射数量以便有足够的虚拟内存可用于mmapped文件

echo "vm.max_map_count=262144" >> /etc/sysctl.conf
sysctl -p

注意修改了data之后原有的账号密码将会失效,可以重新设置密码 修改完成之后重新启动两个容器中的elasticsearch

遇到的错误

ERROR: bootstrap checks failed

  1. memory locking requested for elasticsearch process but memory is not locked

    这是因为锁定内存失败. 只要切换到root用户修改 /etc/security/limits.conf, 添加如下内容即可

    * soft memlock unlimited
    * hard memlock unlimited
    
  2. max file descriptors [4096] for elasticsearch process is too low, increase to at least

    这是因为进程可以创建的文件数太小, 修改 /etc/security/limits.conf, 添加如下内容

    * soft nofile 65536 
    * hard nofile 131072
    

集群中的常见问题

ElasticSearch 5 安装部署常见错误或问题