Docker 安装 ElasticSearch (单机)

前言

本文主要介绍 Docker 如何安装单机版的 ElasticSearch 服务。

版本说明

软件版本描述
Docker20.10.21
ElasticSearch7.4.2DockerHub 镜像地址
Kibana7.4.2DockerHub 镜像地址

ElasticSearch 安装

拉取 Docker 镜像

1
# docker pull elasticsearch:7.4.2

创建配置文件和目录

创建配置目录

1
2
3
4
5
6
7
8
# 创建配置目录
# mkdir -p /etc/elasticsearch/config

# 创建数据目录
# mkdir -p /etc/elasticsearch/data

# 创建插件目录
# mkdir -p /etc/elasticsearch/plugins

创建配置文件

  • jvm.options
1
2
3
4
5
6
7
8
# 创建JVM的配置文件
# touch /etc/elasticsearch/config/jvm.options

# 添加JVM的配置参数
# vim /etc/elasticsearch/config/jvm.options
-Xms128m
-Xmx512m
-Dlog4j2.disable.jmx=true

参数说明

  • -Dlog4j2.disable.jmx=true:设置禁用 Log4j2 的 JMX 功能。
  • -Xms128m:设置 JVM 初始分配的堆内存大小,生产环境可以设置大一点。
  • -Xmx512m:设置 JVM 最大允许分配的堆内存大小,生产环境可以设置大一点。
  • log4j2.properties
1
2
# 创建Log4j2的配置文件
# touch /etc/elasticsearch/config/log4j2.properties
  • elasticsearch.yml
1
2
3
4
5
6
# 创建ES的配置文件
# touch /etc/elasticsearch/config/elasticsearch.yml

# 添加ES的配置参数(冒号后面必须有一个空格)
# vim /etc/elasticsearch/config/elasticsearch.yml
http.host: 0.0.0.0

配置文件授权

1
# chmod -R 777 /etc/elasticsearch

ElasticSearch 运行

Docker 运行容器

1
2
3
4
5
6
7
8
9
# docker run \
--restart=always \
--name elasticsearch \
-p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-v /etc/elasticsearch/data:/usr/share/elasticsearch/data \
-v /etc/elasticsearch/config:/usr/share/elasticsearch/config \
-v /etc/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.4.2

参数说明

  • -e "discovery.type=single-node":设置 Elasticsearch 以单节点运行。
  • -p 9200:9200 -p 9300:9300:设置 Elasticsearch 的监听端口,9200 是 HTTP 端口,9300 是集群通信的端口。

Docker-Compose 运行容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
version: "3.5"

services:
elasticsearch:
image: elasticsearch:7.4.2
container_name: elasticsearch
restart: always
ports:
- 9200:9200
- 9300:9300
environment:
- discovery.type=single-node
volumes:
- '/etc/elasticsearch/data:/usr/share/elasticsearch/data'
- '/etc/elasticsearch/config:/usr/share/elasticsearch/config'
- '/etc/elasticsearch/plugins:/usr/share/elasticsearch/plugins'

查看 Docker 容器是否正常运行

浏览器访问 http://192.168.1.103:9200,若响应得到以下的 JSON 数据,则说明 Elasticsearch 容器正常运行。值得一提的是,192.168.1.103 是 Elasticsearch 容器的 IP 地址,9200 是 Elasticsearch 监听的 HTTP 端口。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"name" : "8b8d235ad522",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "RMg_ymJAQCu_eTcBzI9LKg",
"version" : {
"number" : "7.4.2",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "2f90bbf7b93632e52bcfb59f3b049cb44ec25e96",
"build_date" : "2019-10-28T20:40:44.881551Z",
"build_snapshot" : false,
"lucene_version" : "8.2.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}

若 Elasticsearch 容器无法正常运行,可使用以下命令查看容器的日志信息。

1
# docker logs -f --tail 50 elasticsearch

Kibana 安装与运行

Kibana 是一个开源的分析与可视化平台,设计出来用于和 Elasticsearch 一起使用。开发者可以用 Kibana 搜索、查看存放在 Elasticsearch 中的数据。Kibana 与 Elasticsearch 的交互方式是各种不同的图表、表格、地图等,直观地展示数据,从而达到高级的数据分析与可视化的目的。值得一提的是,Elasticsearch、Logstash 和 Kibana 这三个技术就是我们常说的 ELK 技术栈,可以说这三个技术的组合是大数据领域中一个很巧妙的设计。一种很典型的 MVC 思想,模型持久层、视图层和控制层。Logstash 担任控制层的角色,负责搜集和过滤数据。Elasticsearch 担任数据持久层的角色,负责储存数据。Kibana 担任视图层角色,拥有各种维度的查询和分析,并使用图形化的界面展示存放在 Elasticsearch 中的数据。

拉取 Docker 镜像

1
# docker pull kibana:7.4.2

Docker 运行容器

1
# docker run --name kibana --restart=always -e ELASTICSEARCH_HOSTS=http://192.168.1.103:9200 -p 5601:5601 -d kibana:7.4.2

参数说明

  • -p 5601:5601:指定 Kibana 监听的 HTTP 端口。
  • -e ELASTICSEARCH_HOSTS=http://192.168.1.103:9200:指定 Elasticsearch 服务器的地址。

Docker-Compose 运行容器

1
2
3
4
5
6
7
8
9
10
11
version: "3.5"

services:
kibana:
image: kibana:7.4.2
container_name: kibana
restart: always
ports:
- 5601:5601
environment:
- ELASTICSEARCH_HOSTS=http://192.168.1.103:9200

查看 Docker 容器是否正常运行

浏览器访问 http://192.168.1.115:5601,若 Web 页面可以正常显示,则说明 Kibana 容器正常运行。值得一提的是,192.168.1.115 是 Kibana 容器的 IP 地址,5601 是 Kibana 监听的 HTTP 端口。若 Kibana 容器无法正常运行,可使用以下命令查看容器的日志信息。

1
# docker logs -f --tail 50 Kibana

常见错误解决

错误一

Elasticsearch 容器启动后,抛出以下的异常信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
main ERROR Could not register mbeans java.security.AccessControlException: access denied ("javax.management.MBeanTrustPermission" "register")
at java.base/java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
at java.base/java.lang.SecurityManager.checkPermission(SecurityManager.java:444)
at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.checkMBeanTrustPermission(DefaultMBeanServerInterceptor.java:1805)
at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerMBean(DefaultMBeanServerInterceptor.java:318)
at java.management/com.sun.jmx.mbeanserver.JmxMBeanServer.registerMBean(JmxMBeanServer.java:522)
at org.apache.logging.log4j.core.jmx.Server.register(Server.java:393)
at org.apache.logging.log4j.core.jmx.Server.reregisterMBeansAfterReconfigure(Server.java:168)
at org.apache.logging.log4j.core.jmx.Server.reregisterMBeansAfterReconfigure(Server.java:141)
at org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java:558)
at org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:263)
at org.elasticsearch.common.logging.LogConfigurator.configure(LogConfigurator.java:234)
at org.elasticsearch.common.logging.LogConfigurator.configure(LogConfigurator.java:127)
at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:310)
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:159)
at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:150)
at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86)
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:125)
at org.elasticsearch.cli.Command.main(Command.java:90)
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:115)
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:92)

解决的方法是在 Elasticsearch 启动之前,添加禁用 Log4j2 的 JMX 功能的 JVM 参数,详细说明请看 这里

  • 第一种添加方法:在上述的 config/jvm.options 配置文件中添加 JVM 参数:
1
-Dlog4j2.disable.jmx=true
  • 第二种添加方法:在上述的 Docker 命令中添加 JVM 参数:
1
2
3
4
5
6
7
8
9
10
11
# docker run \
--restart=always \
--privileged=true \
--name elasticsearch \
-p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Dlog4j2.disable.jmx=true" \
-v /etc/elasticsearch/data:/usr/share/elasticsearch/data \
-v /etc/elasticsearch/config:/usr/share/elasticsearch/config \
-v /etc/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.4.2