docker-compose部署es集群
部署环境为centos7
一、docker安装
参考地址:https://docs.docker.com/engine/install/centos/
# 1.卸载旧版本
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
# 2.设置仓库
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 3.安装 Docker Engine-Community
sudo yum install docker-ce docker-ce-cli containerd.io
#查看可用于安装的版本,并根据版本安装。我是默认安装最新的
yum list docker-ce --showduplicates | sort –r
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
# 4.启动docker
sudo systemctl start docker
# 5.测试
docker run hello-world
# 使用docker ps命令查看,如果没有,说明没启动成功。可能的原因是需要创建daemon.json以设置镜像加速器
二、docker-compose安装
参考地址:https://docs.docker.com/compose/install/
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 1.将可执行权限应用于二进制文件
sudo chmod +x /usr/local/bin/docker-compose
# 2.创建软链
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# 3.测试
docker-compose --version
三、ES集群配置
在同一台服务器上模拟ES集群,这里由于一些原因,我选择的是6.8版本的。
1、创建目录
# 数据目录(由于模拟,所以需要创建三个)
mkdir -p /home/es/data/data1
mkdir -p /home/es/data/data2
mkdir -p /home/es/data/data3
# 配置文件目录(由于模拟,所以需要创建三个)
mkdir -p /home/es/config/config1
mkdir -p /home/es/config/config2
mkdir -p /home/es/config/config3
# 其他目录可根据条件自行创建
# ...
2、设置目录权限
chmod 777 /home/es/data/data1
# 其他类似
3、docker-compose配置文件
为了便利,我将所有配置放在一个文件中。(如果只是想简单搭建一个es集群可以参考官网https://www.elastic.co/guide/en/elasticsearch/reference/6.8/docker.html)
# 我在这里仅贴出来一个节点的配置,其他节点的配置和这配置差不多,只是需要修改端口和目录映射
version: '2.2' #官网配置文件的版本
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:6.8.17
container_name: elasticsearch
environment:
- cluster.name=docker-cluster
- bootstrap.memory_lock=true
# 设置jvm堆内存参数。配置足够容量的堆大小以确保Elasticsearch功能和性能是必要的(Elasticsearch JVM使用堆内存最小和最大大小为2 GB(5.X版本以上))
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- #node (这些配置可定义es节点的类型(功能))
# 是否有资格成为主节点(默认为true)
- node.master=true
# 是否是数据节点(默认为true)
- node.data=true
# 节点摄入(默认为true)
- node.ingest=true
# 角色(默认为true)
- node.ml=true
# 支持远程集群访问(默认为true)
- cluster.remote.connect=true
#network
# 该节点将绑定到此主机名或 IP 地址并将此主机发布(通告)到集群中的其他节点。(0.0.0.0是可接受的 IP 地址,将绑定到所有网络接口)
- network.host=0.0.0.0
# 指定节点应绑定到哪个网络接口以侦听传入请求。一个节点可以绑定到多个接口
#- network.bind_host=127.0.0.1
# 发布主机是节点向集群中的其他节点通告的单一接口,以便这些节点可以连接到它(发布只有一个)
#- network.publish_host=127.0.0.1
# 传入的 HTTP 请求绑定到的端口(默认为9200-9300)
- http.port=9200
# 绑定节点之间通信的端口(默认为9300-9400)
- transport.port=9300
#discovery
# 此设置提供此节点将尝试联系的其他节点的初始列表
- "discovery.zen.ping.unicast.hosts=elasticsearch,elasticsearch2"
# 形成集群的符合主节点条件的最小节点数。为避免脑裂,此设置应设置为符合 master 资格的节点数:(master_eligible_nodes / 2) + 1
- discovery.zen.minimum_master_nodes=2
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- /home/es/data/data1:/usr/share/elasticsearch/data
ports:
- 9200:9200
networks:
- esnet
networks:
esnet:
4、启动
docker-compose up -d
# 如果配置文件名不是docker-compose.yml,可使用
docker-compose -f 文件名 up -d
启动后可查看日志
docker logs -f elasticsearch
四、开启安全模式
据了解,es6.8内置了xpack,xpack用于安全权限控制等。但是xpack只提供部分功能。
也可以使用其他方案,nginx或者search guade(开源)。
在这里我使用的是xpack
1.进入es容器,并创建证书
#查看启动的容器
docker ps
#进入其中一个容器
docker exec -it 容器ID或名称 /bin/bash
#创建证书颁发机构
bin/elasticsearch-certutil ca
#生成证书和私钥
bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
#退出容器
exit
#从容器中拷贝证书
docker cp 容器ID/容器名:/usr/share/elasticsearch/elastic-certificates.p12 宿主机路径
docker cp 容器ID/容器名:/usr/share/elasticsearch/elastic-stack-ca.p12 宿主机路径
- 注意:在创建证书颁发机构和生成证书和私钥的时候,需要输入密码,然后将密码添加进keystore里。但是在实际操作中,我设置密码并将密码添加至keystore后,启动es集群,从节点会报错。所以在创建和生成时,我一路enter。
2.添加配置
environment:
- http.cors.enabled=true
- http.cors.allow-origin=*
- http.cors.allow-headers=Authorization,X-Requested-With,Content-Length,Content-Type
# 配置传输层tls/ssl加密传输
- xpack.security.enabled=true
- xpack.security.authc.accept_default_password=true
- xpack.security.transport.ssl.enabled=true
#证书方式
- xpack.security.transport.ssl.verification_mode=certificate
- xpack.security.transport.ssl.keystore.path=/usr/share/elasticsearch/config/certificates/elastic-certificates.p12
- xpack.security.transport.ssl.truststore.path=/usr/share/elasticsearch/config/certificates/elastic-certificates.p12
# 配置http层tls/ssl加密传输
# 这个配置可以用,但是配置后使用浏览器访问es集群是不安全的,可能是证书问题,所以最后没开启
#- xpack.security.http.ssl.enabled=true
#- xpack.security.http.ssl.keystore.path=/usr/share/elasticsearch/config/certificates/elastic-certificates.p12
#- xpack.security.http.ssl.truststore.path=/usr/share/elasticsearch/config/certificates/elastic-certificates.p12
volumes:
- 证书路径:/usr/share/elasticsearch/config/certificates
3.设置密码
再次执行docker-compose up启动集群,再打开一个terminal,进入任意一个容器,执行
./bin/elasticsearch-setup-passwords interactive
设置完成后,再访问Elasticsearch集群时,就需要提供用户名和密码才能访问。账号为elastic,密码为设置的密码。