最近刚换了公司,然后公司刚好使用的docker。而本人作为一个石锤的搬砖员,之前只知道搬砖们,对于这些东西确实没学过。今天在本地使用docker搭建elasticsearch集群,记录下过程,而且elasticsearch也是本人之前没学过的,最近会先学习elasticsearch使用,同时熟悉docker的使用。
docker安装
本人实在win10系统,所以安装的是Docker for Windows Installer
下载:链接:https://pan.baidu.com/s/13Gxzi-0gDqflnVRaUD0uGg 提取码:8xqh
关于docker的使用这里就不详细说了,因为网上确实有很多相关的文章。
准备工作
- docker拉取elasticsearch镜像image
docker search elasticsearch # 查找镜像
docker pull elasticsearch # 拉取镜像,可以指定版本,如果没有指定,则默认版本
对于拉下来的elasticsearch,我们需要检查它的版本,因为最新的7.x的版本配置和之前的集群配置不一样,所以我们需要看下是哪个版本
docker images # 列出所以已经拉取的镜像列表
docker inspect 5acf0e8da90b # 通过inspect命令可以查看对应镜像的信息
- 本地创建集群的data和logs目录,以及config目录,会挂载到docker容器,这样容器就能共享宿主机文件
|--es-cluster
| |--docker-compose.yml docker-compose组件方式运行文件
| |--config 节点配置文件
| |--es01/elasticsearch.yml
| |--es02/elasticsearch.yml
| |--es03/elasticsearch.yml
| |--data
| |--es01
| |--es02
| |--es03
| |--logs
| |--es01
| |--es02
| |--es03
安装elasticsearch集群
安装es集群,这里我们通过docker-compose的方式进行安装。
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
一般情况下Compose 使用的三个步骤:
1-使用 Dockerfile 定义应用程序的环境。(定制镜像)
2-使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
3-最后,执行 docker-compose up 命令来启动并运行整个应用程序。
- 创建自定义bridge网络
Docker容器之间需要通信,所以需要知道他们的ip是什么,并且是在es的配置文件中进行配置,说明需要固定的ip,每次启动都一样,不能是动态。所以这里就自定义网络,然后启动的时候对三个节点指定固定的ip。
创建自定义网络esnet
# 该命令进行创建一个自定义的network
docker network create --driver bridge --subnet=172.19.0.0/16 --gateway=172.19.0.1 esnet
--driver bridge # 指定网络模式为bridge,默认会在主机上创建一个docker0虚拟网桥
--subnet=172.19.0.0/16 # --subnet选项创建自定义子网并覆盖默认值
--gateway=172.19.0.1 # 自定义网关
这里需要注意:
我们在宿主机使用ping去查看能否ping同你自定义的网络ip,比如
ping 172.19.0.1
如果ping不同,我们可以在宿主机使用route添加路由处理,win10系统添加route操作是需要管理员权限下才可以
route add -p 172.19.0.0 mask 255.255.0.0 10.0.75.2
当然,你只要暴露了端口,宿主机ping不通容器的ip,也是可以访问的。
- 使用 docker-compose.yml 定义构成应用程序的服务
# 指定本 yml 依从的 compose 哪个版本制定的。
version: '3'
# 容器使用 esnet 网络
networks:
default:
external:
name: esnet
# yaml 配置实例
services:
# es01 节点
es01:
# 指定容器运行的镜像
image: 5acf0e8da90b
# 容器名称
container_name: es01
# 容器总是重新启动
restart: always
# 添加环境变量
environment:
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
# 覆盖容器默认的 ulimit,设置容器的 limit
ulimits:
memlock:
soft: -1
hard: -1
# 将主机的数据卷或着文件挂载到容器里
volumes:
- ./data/es01:/usr/share/elasticsearch/data
- ./config/es01/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- ./logs/es01:/usr/share/elasticsearch/logs
# 端口映射
ports:
- 9200:9200
- 9300:9300
# 指定ip
networks:
default:
ipv4_address: 172.19.0.2
# 允许容器中运行一些特权命令
privileged: true
# es02 节点
es02:
# 指定容器运行的镜像
image: 5acf0e8da90b
# 容器名称
container_name: es02
# 容器总是重新启动
restart: always
# 添加环境变量
environment:
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
# 覆盖容器默认的 ulimit,设置容器的 limit
ulimits:
memlock:
soft: -1
hard: -1
# 将主机的数据卷或着文件挂载到容器里
volumes:
- ./data/es02:/usr/share/elasticsearch/data
- ./config/es02/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- ./logs/es02:/usr/share/elasticsearch/logs
# 端口映射
ports:
- 9400:9200
- 9500:9300
# 指定ip
networks:
default:
ipv4_address: 172.19.0.3
# 允许容器中运行一些特权命令
privileged: true
# es03 节点
es03:
# 指定容器运行的镜像
image: 5acf0e8da90b
# 容器名称
container_name: es03
# 容器总是重新启动
restart: always
# 添加环境变量
environment:
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
# 覆盖容器默认的 ulimit,设置容器的 limit
ulimits:
memlock:
soft: -1
hard: -1
# 将主机的数据卷或着文件挂载到容器里
volumes:
- ./data/es03:/usr/share/elasticsearch/data
- ./config/es03/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- ./logs/es03:/usr/share/elasticsearch/logs
# 端口映射
ports:
- 9600:9200
- 9700:9300
# 指定ip
networks:
default:
ipv4_address: 172.19.0.4
# 允许容器中运行一些特权命令
privileged: true
compose的yml文件我基本上已经注释了。上面设置了三个容器,基本上已经注释了,一看就明白。
networks 网络配置,文件中在三个容器的最前面已经配置了容器使用的自定义网络esnet,然后再容器内部配置ipv4_address固定容器ip
volumes 配置挂载,相当于docker中 -v 命令,使得容器能够共享宿主机的文件
ports 端口映射,前面是宿主机的端口映射到容器的端口
- es集群配置文件elasticsearch.yml
三个es节点的配置差不多,这里我之展示一个es01节点的配置
# ======================== Elasticsearch Configuration =========================
# ---------------------------------- Cluster -----------------------------------
# 指定集群的名字
cluster.name: es-cluster
# 手动指定可以成为 mater 的所有节点的 name 或者 ip,这些配置将会在第一次选举中进行计算,第一次启动全新的Elasticsearch集群时,会有一个集群引导
# cluster.initial_master_nodes: ["es01"]
# ------------------------------------ Node ------------------------------------
# 给master起一个名称
node.name: es01
# 该节点就得到允许,可以成为master节点
node.master: true
# ----------------------------------- Paths ------------------------------------
# 数据存储
path.data: /usr/share/elasticsearch/data
# 日志存储
path.logs: /usr/share/elasticsearch/logs
# ----------------------------------- Memory -----------------------------------
# 绑定的ip地址和默认端口号9200
network.host: 172.19.0.2
# 端口9200 默认端口也是9200
http.port: 9200
# TCP的默认监听端口,默认 9300,节点内部通信port
transport.tcp.port: 9300
# 允许跨域配置
http.cors.enabled: true
http.cors.allow-origin: "*"
# --------------------------------- Discovery ----------------------------------
# es7.x 之后的集群配置方式
# 写入候选主节点的设备地址,在开启服务后可以被选为主节点
#discovery.seed_hosts: ["172.19.0.2:9300", "172.19.0.3:9300", "172.19.0.4:9300"]
# 指定master主节点,用来初始化主节点作为引导集群.启动全新的集群时需要此参数,再次重新启动时此参数可免
# cluster.initial_master_nodes: ["es01","es02","es03"]
# es7.x 之前的集群配置方式
# 设置集群中master节点的初始列表,可以通过这些节点来自动发现新加入集群的节点。
discovery.zen.ping.unicast.hosts: ["172.19.0.2:9300", "172.19.0.3:9300", "172.19.0.4:9300"]
注意这里我们前面镜像的版本是5.6的,所以不可以使用7.x之后的一些配置否则es启动报错。
三个节点情况,使用esnet网络,网段是172.19.0.0/16
es01: ip=172.19.0.2 端口映射=9200:9200、9300:9300
es02: ip=172.19.0.3 端口映射=9400:9200、9500:9300
es03: ip=172.19.0.4 端口映射=9600:9200、9700:9300
- 使用 docker Compose 命令构建和运行应用
docker up -d # 构建,想在后台执行该服务可以加上 -d 参数
以上命令需要在你的docker-compose.yml文件所在位置执行,否则会提示找不到docker-compose.yml命令等信息。
最后你可以通过docker/docker-compose命令查看容器信息
可以查看log,使用命令
dockers-compose logs 容器名称
docker logs 容器id
最后通过映射端口访问一下: