[v8.6] 使用docker-compose安装Elasticsearch/Kibana的步骤(供试用使用)

首先

本文介绍了在Windows/Linux操作系统上安装Elasticsearch的过程。

    • Windows

 

    Linux

我想展示使用Docker Compose的步骤。我正在使用最新版本8.6.2进行操作。

使用docker-compose的好处有几个。

    • 自分のPCや仮想マシンの環境を汚さずに済む

 

    • 設定ファイルを作ってしまえば、コマンド一発で立ち上がる

 

    • KibanaとElasticsearch間のセキュア通信の設定が自動で行われる

 

    環境依存がない(docker-composeさえ動けば良い)

在实验环境下尝试了这个步骤。

    • クラウド:GCP

 

    • OS: Debian GNU/Linux 11 (bullseye)

 

    • スペック: e2.mediumインスタンス (2 vCPU, 4GB mem)

 

    • Docker version 20.10.23, build 7155243

 

    Docker Compose version v2.16.0

由于初始状态下没有安装docker/docker-compose,让我们开始安装。

准备好

vm.max_map_count的含义

很可能原样运行时,Elasticsearch无法启动。
请执行以下命令:
sudo sysctl -w vm.max_map_count=262144
https://www.elastic.co/guide/en/elasticsearch/reference/current/vm-max-map-count.html

防火墙规则

スクリーンショット 2023-03-10 14.04.03.png

文件

基本上,以下链接中的内容是可以使用的,但是如果直接使用这个docker-compose文件,将会形成一个三节点的结构。
https://www.elastic.co/guide/en/elasticsearch/reference/8.6/docker.html#docker-compose-file
稍微编辑一下文件,可以在一个节点上启动。

设置文件

创建一个合适的目录并将以下两个文件放置在创建的目录中。

.
├── .env
├── docker-compose.yml

docker-compose.yml (Chinese: docker-compose.yml)

我会直接复制并使用下述内容。

version: "2.2"

services:
  setup:
    image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
    container_name: setup
    volumes:
      - certs:/usr/share/elasticsearch/config/certs
    user: "0"
    command: >
      bash -c '
        if [ x${ELASTIC_PASSWORD} == x ]; then
          echo "Set the ELASTIC_PASSWORD environment variable in the .env file";
          exit 1;
        elif [ x${KIBANA_PASSWORD} == x ]; then
          echo "Set the KIBANA_PASSWORD environment variable in the .env file";
          exit 1;
        fi;
        if [ ! -f config/certs/ca.zip ]; then
          echo "Creating CA";
          bin/elasticsearch-certutil ca --silent --pem -out config/certs/ca.zip;
          unzip config/certs/ca.zip -d config/certs;
        fi;
        if [ ! -f config/certs/certs.zip ]; then
          echo "Creating certs";
          echo -ne \
          "instances:\n"\
          "  - name: es01\n"\
          "    dns:\n"\
          "      - es01\n"\
          "      - localhost\n"\
          "    ip:\n"\
          "      - 127.0.0.1\n"\
          > config/certs/instances.yml;
          bin/elasticsearch-certutil cert --silent --pem -out config/certs/certs.zip --in config/certs/instances.yml --ca-cert config/certs/ca/ca.crt --ca-key config/certs/ca/ca.key;
          unzip config/certs/certs.zip -d config/certs;
        fi;
        echo "Setting file permissions"
        chown -R root:root config/certs;
        find . -type d -exec chmod 750 \{\} \;;
        find . -type f -exec chmod 640 \{\} \;;
        echo "Waiting for Elasticsearch availability";
        until curl -s --cacert config/certs/ca/ca.crt https://es01:9200 | grep -q "missing authentication credentials"; do sleep 30; done;
        echo "Setting kibana_system password";
        until curl -s -X POST --cacert config/certs/ca/ca.crt -u "elastic:${ELASTIC_PASSWORD}" -H "Content-Type: application/json" https://es01:9200/_security/user/kibana_system/_password -d "{\"password\":\"${KIBANA_PASSWORD}\"}" | grep -q "^{}"; do sleep 10; done;
        echo "All done!";
      '
    healthcheck:
      test: ["CMD-SHELL", "[ -f config/certs/es01/es01.crt ]"]
      interval: 1s
      timeout: 5s
      retries: 120
    mem_limit: ${MEM_LIMIT}
  es01:
    depends_on:
      setup:
        condition: service_healthy
    image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
    container_name: es01
    volumes:
      - certs:/usr/share/elasticsearch/config/certs
      - esdata01:/usr/share/elasticsearch/data
      - ./:/etc/elasticsearch
    ports:
      - ${ES_PORT}:9200
    environment:
      - node.name=es01
      - cluster.name=${CLUSTER_NAME}
      - cluster.initial_master_nodes=es01
      - discovery.seed_hosts=es01
      - ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
      - bootstrap.memory_lock=true
      - xpack.security.enabled=true
      - xpack.security.http.ssl.enabled=true
      - xpack.security.http.ssl.key=certs/es01/es01.key
      - xpack.security.http.ssl.certificate=certs/es01/es01.crt
      - xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt
      - xpack.security.http.ssl.verification_mode=certificate
      - xpack.security.transport.ssl.enabled=true
      - xpack.security.transport.ssl.key=certs/es01/es01.key
      - xpack.security.transport.ssl.certificate=certs/es01/es01.crt
      - xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt
      - xpack.security.transport.ssl.verification_mode=certificate
      - xpack.license.self_generated.type=${LICENSE}
    mem_limit: ${MEM_LIMIT}
    ulimits:
      memlock:
        soft: -1
        hard: -1
    healthcheck:
      test:
        [
          "CMD-SHELL",
          "curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q 'missing authentication credentials'",
        ]
      interval: 10s
      timeout: 10s
      retries: 120
  kibana:
    depends_on:
      es01:
        condition: service_healthy
    image: docker.elastic.co/kibana/kibana:${STACK_VERSION}
    container_name: kibana
    volumes:
      - certs:/usr/share/kibana/config/certs
      - kibanadata:/usr/share/kibana/data
    ports:
      - ${KIBANA_PORT}:5601
    environment:
      - SERVERNAME=kibana
      - ELASTICSEARCH_HOSTS=https://es01:9200
      - ELASTICSEARCH_USERNAME=kibana_system
      - ELASTICSEARCH_PASSWORD=${KIBANA_PASSWORD}
      - ELASTICSEARCH_SSL_CERTIFICATEAUTHORITIES=config/certs/ca/ca.crt
    mem_limit: ${MEM_LIMIT}
    healthcheck:
      test:
        [
          "CMD-SHELL",
          "curl -s -I http://localhost:5601 | grep -q 'HTTP/1.1 302 Found'",
        ]
      interval: 10s
      timeout: 10s
      retries: 120

volumes:
  certs:
    driver: local
  esdata01:
    driver: local
  kibanadata:
    driver: local

.env文件

请根据需要更改,这是在docker-compose.yml文件中使用的变量。
如果MEM_LIMIT太小,将无法启动。

STACK_VERSION = 8.6.2
ELASTIC_PASSWORD = elastic
KIBANA_PASSWORD = elastic
ES_PORT = 9200
CLUSTER_NAME = test_cluster
LICENSE = trial
MEM_LIMIT = 1073741824
KIBANA_PORT = 5601

开机

在创建的目录中运行docker-compose up -d。
获取映像可能需要一些时间。
容器映像的大小大致如下。

$ docker images
REPOSITORY                                      TAG       IMAGE ID       CREATED       SIZE
docker.elastic.co/kibana/kibana                 8.6.2     65e53ffb7df5   3 weeks ago   727MB
docker.elastic.co/elasticsearch/elasticsearch   8.6.2     04485c81cc2d   3 weeks ago   1.29GB

打开 Kibana 并登录

执行 docker-compose logs -f 命令,当出现以下部分时,即可登录到 Kibana。

kibana  | [2023-03-10T05:13:52.067+00:00][INFO ][status] Kibana is now available (was degraded)

如果要使用自己的PC或带有GUI的虚拟机从该机器上使用,则使用http://localhost:5601。如果是在不同的位置,则使用http://<IP地址>:5601。

错误 (wù)

有时会以以下的方式失败。

takeo_furukubo_elastic_co@takeo-docker-vm:~/elastic/singlenode$ docker-compose up -d
[+] Running 3/4
 ⠿ Network singlenode_default  Created                                                                                      0.1s
 ⠿ Container setup             Healthy                                                                                      2.5s
 ⠿ Container es01              Error                                                                                       41.9s
 ⠿ Container kibana            Created        

在这种情况下,如果先运行docker-compose down然后再运行docker-compose up -d,就会启动。

内存不足

如果再次运行docker-compose up -d时容器没有启动,可能是内存不足。
当内存不足时,docker-compose的输出与上述情况相同。
由于失败发生得非常快,很容易区别出来。
运行docker logs es01,并且显示ERROR: Elasticsearch exited unexpectedly。
可以增加主机的内存或增加MEM_LIMIT。

停下来

在存放docker-compose.yml文件的位置执行docker-compose down

删除

如果您想要删除所有容器镜像、卷等,请在停止后运行docker system prune -a命令。
请注意,这会删除除Elasticsearch以外的所有内容。

最终

完成这个步骤后,您将能够在Kibana中进行数据分析。我们将在未来按以下内容进行记录。

    • Elastic Agentが使えるようにdocker-composeでFleetを立ち上げる

 

    • Elasticsearchを複数立ち上げる

 

    Master Dedicatedを立ち上げる

弹性云免费试用

请务必试用我们的Elastic Cloud免费试用14天。

请参考下方链接以查看详细步骤。
关于 Elastic Cloud – 试试部署一个实例。

bannerAds