使用 Docker Compose 部署 Elasticsearch + Kibana

2023/6/6 Docker

本文主要介绍使用 Docker Compse 部署 Elasticsearch + Kibana,并整合到 Spring Boot 项目中的详细步骤。

Elasticsearch + Kibana 版本: 7.17.0(7 的最新版本);Spring Boot 版本:2.7.5 。

Kibana 官方文档 (opens new window)Elasticsearch官方文档 (opens new window)

# 服务器目录结构

—— root
  |—— mall  // 根目录
      |—— pack 
          |—— elastic
              |-- config
                  |-- elasticsearch.yml     // Elasticsearch 配置文件
              |-- data  // Elasticsearch 数据目录
              |-- plugins       // Elasticsearch 插件目录
              |-- docker-compose.yaml   // 启动容器
              |-- kibana
                  |-- kibana.yml    kibana 配置文件
1
2
3
4
5
6
7
8
9
10
11

# 部署 Elasticsearch 和 Kibana

# 启动容器

  1. config 目录下,编写 elasticsearch.yml 配置文件,内容如下。
network.host: 0.0.0.0
discovery.type: single-node
1
2
  1. kibana 目录下,编写 kibana.yml 配置文件,内容如下。
server.host: 0.0.0.0
server.name: kibana
1
2
  1. elastic 目录下,编写 docker-compose.yaml 配置文件,内容如下。
version: '3.3'
services:
    elasticsearch:
        restart: always
        image: elasticsearch:7.17.0     # 使用的镜像名称
        container_name: elasticsearch   # 容器名称
        ports:  # 指定暴露的端口
          - 9200:9200
          - 9300:9300
        environment: 
          - ES_JAVA_OPTS= -Xms2g -Xmx2g # 指定 JVM 内存大小
        volumes:    # 指定挂载目录
          - ~/mall/pack/elastic/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
          - ~/mall/pack/elastic/data:/usr/share/elasticsearch/data
          - ~/mall/pack/elastic/plugins:/usr/share/elasticsearch/plugins
        networks:   # 网络配置
           - elasticsearch-network
    kibana:
        restart: always
        image: kibana:7.17.0
        container_name: kibana
        ports:
         - 5601:5601
        depends_on: # 服务依赖
          - elasticsearch
        volumes:
          - ~/mall/pack/elastic/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml
        networks:
          - elasticsearch-network
networks:
  elasticsearch-network:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
  1. 执行如下命令,启动容器。
docker-compose up -d    // 启动容器
docker-compose logs -f  // 查看容器启动日志
1
2
  1. 分别访问 localhost:9200 和 localhost:5601 网址。显示如下信息和界面,说明 Elasticsearch 服务和 Kibana 服务部署成功。
{
  "name" : "cf55d2d2cfd9",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "ZqDLEOikRW-W8YU4qQuC5A",
  "version" : {
    "number" : "7.17.0",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "bee86328705acaa9a6daede7140defd4d9ec56bd",
    "build_date" : "2022-01-28T08:36:04.875279988Z",
    "build_snapshot" : false,
    "lucene_version" : "8.11.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

image-20230605100450480.png

# 设置登陆密码

  1. 在 elasticsearch.yml 配置文件中添加如下配置
xpack.security.enabled: true
1
  1. 执行如下命令,进入到 elasticsearch 容器中。
docker exec -it elasticsearch /bin/bash
1
  1. 执行如下命令,设置密码。一共有七个用户,依次设置这七个用户的密码,我这里统一将密码设置成 123456。
/usr/share/elasticsearch/bin/elasticsearch-setup-passwords interactive
1

image-20230605103218114.png

  1. 退出容器,然后在 kibana.yml 文件中添加如下配置。
elasticsearch.username: "elastic"
elasticsearch.password: "123456"
1
2
  1. 重新启动容器,再次访问页面,会出现弹框,输入用户名和密码登陆即可。默认用户名为:elastic 。
docker-compose down
docker-compose up -d
1
2

# 完整配置文件内容

更多配置可以参考官方文档。

  • elasticsearsh.yml
network.host: 0.0.0.0
discovery.type: single-node
xpack.security.enabled: true
1
2
3
  • kibana.yml
server.host: 0.0.0.0
server.name: kibana
elasticsearch.username: "elastic"
elasticsearch.password: "123456"
1
2
3
4

# Spring Boot 整合 Elasticsearch

Spring Data Elasticsearch 官方文档 (opens new window)

# 添加依赖

Spring Boot 版本要与 Elasticsearch 版本对应上,对应关系如下图所示。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
    <!--  版本为 Spring Boot 版本  -->
    <version>2.7.5</version> 
</dependency>
1
2
3
4
5
6

image-20230605182211128.png

# 添加配置

在 application.yaml 配置文件中新增如下配置。

spring:
  elasticsearch:
    username: elastic
    password: 123456
    uris: http://192.168.107.65:9200  // 虚拟机地址
    connection-timeout: 10s
1
2
3
4
5
6

# 使用

本文只介绍 Elasticsearch 的基本使用,更详细的用法可以查看官方文档。

  1. 引入 ElasticsearchRestTemplate
@RestController
@RequestMapping("/demo")
public class Demo {
    @Resource
    private ElasticsearchRestTemplate elasticsearchRestTemplate;
    
    /**
    * 创建索引
    **/
    @GetMapping("/createIndex")
    public void createIndex() {
        IndexOperations indexOps = esRestTemplate.indexOps(IndexCoordinates.of("elasticsearch"));
        boolean result = indexOps.create();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  1. 访问地址,创建索引。然后通过 Kibana 查看新增的索引。

image-20230606102111649.png

# 问题

  1. elasticsearch 容器启动报错。原因是挂载的 data 目录权限不够。

    解决:执行命令 chmod -R 777 data ,然后重新启动容器即可。

image-20230605094800124.png

  1. elasticsearch 容器内存占用高达 13G。

    解决:在 docker-compose.yaml 文件中添加如下配置,指定 JVM 内存占用大小。

environment:
  - ES_JAVA_OPTS= -Xms2g -Xmx2g
1
2
更新时间: 2023/12/20 上午7:12:16