Docker 部署 Elasticsearch 教程 – wiki基地


使用 Docker 部署 Elasticsearch 教程

引言

Elasticsearch 是一个功能强大的开源分布式搜索和分析引擎,能够处理不断增长的用例。作为 Elastic Stack 的核心,它集中存储您的数据,以实现闪电般的快速搜索、精细调整的相关性和强大的分析功能。

Docker 是一个利用操作系统级虚拟化技术交付软件的平台,它将软件打包成称为容器的独立单元。容器彼此隔离,并捆绑自己的软件、库和配置文件;它们可以通过明确定义的通道相互通信。

使用 Docker 部署 Elasticsearch 具有多项优势:
* 可移植性: 在不同环境(开发、测试、生产)中一致地运行 Elasticsearch。
* 隔离性: 容器将 Elasticsearch 与主机系统上的其他应用程序隔离。
* 易于设置: 快速启动和关闭 Elasticsearch 实例,便于开发和测试。

本教程将指导您如何使用 Docker 部署 Elasticsearch,我们将介绍使用 docker run 的基本单节点设置,以及使用 Docker Compose 部署包含 Kibana 的更健壮设置。

先决条件

在开始之前,请确保您已安装以下软件并进行相应配置:

  1. Docker Desktop: 包含 Docker Engine 和 Docker Compose。请从官方 Docker 网站下载并安装适用于您操作系统的版本。
  2. 内存分配: 确保为 Docker Desktop 分配至少 4GB 内存。您可以在 Docker Desktop 设置中通过 Settings > Resources 进行调整。
  3. vm.max_map_count 设置: Elasticsearch 在 Linux 主机上需要特定的内核设置。如果您在 Linux(或 Windows 上的 WSL2)上运行 Docker,需要增加 vm.max_map_count 的值。
    • 临时设置(重启后失效):
      bash
      sudo sysctl -w vm.max_map_count=262144
    • 永久设置(跨重启):
      vm.max_map_count=262144 添加到 /etc/sysctl.conf 文件中,然后运行 sudo sysctl -p 使其生效。

基本单节点 Elasticsearch 部署 (使用 docker run)

此方法适用于快速测试和开发环境。

  1. 创建 Docker 网络:
    为您的服务创建一个专用的 Docker 网络是一个好习惯,这允许它们通过名称进行通信。
    bash
    docker network create elastic

  2. 拉取 Elasticsearch Docker 镜像:
    我们将使用 8.12.2 版本以保持一致性。您可以根据需要选择其他版本。
    bash
    docker pull docker.elastic.co/elasticsearch/elasticsearch:8.12.2

  3. 运行 Elasticsearch 容器:
    此命令启动一个单节点的 Elasticsearch 实例。
    bash
    docker run --name es01 --net elastic -p 9200:9200 -p 9300:9300 \
    -e "discovery.type=single-node" \
    -e "xpack.security.enabled=false" \
    -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
    -m 1GB \
    docker.elastic.co/elasticsearch/elasticsearch:8.12.2

    • --name es01: 为容器指定名称。
    • --net elastic: 将容器连接到 elastic 网络。
    • -p 9200:9200 -p 9300:9300: 将 Elasticsearch 的 HTTP API 端口 (9200) 和节点间通信端口 (9300) 从容器映射到您的主机。
    • -e "discovery.type=single-node": 将 Elasticsearch 配置为单节点集群,这对于开发设置是必需的。
    • -e "xpack.security.enabled=false": 禁用安全功能以方便本地测试。 不建议在生产环境中使用此设置。
    • -e "ES_JAVA_OPTS=-Xms512m -Xmx512m": 为 Elasticsearch 设置 Java 虚拟机 (JVM) 堆大小。根据您的可用内存调整这些值。
    • -m 1GB: 为 Docker 容器设置内存限制。
  4. 验证 Elasticsearch 是否正在运行:
    打开一个新的终端并运行:
    bash
    curl localhost:9200

    您应该会收到一个 JSON 响应,其中包含有关您的 Elasticsearch 节点的信息。

  5. 停止并移除容器:
    要停止正在运行的容器(在运行容器的终端中按 Ctrl+C,或在另一个终端中使用 docker stop):
    bash
    docker stop es01
    docker rm es01

Elasticsearch 和 Kibana 部署 (使用 Docker Compose)

Docker Compose 是定义和运行多容器 Docker 应用程序的理想工具。此设置将同时包含 Elasticsearch 和 Kibana,后者是用于 Elasticsearch 的数据可视化和管理工具。

  1. 创建项目目录:
    bash
    mkdir elastic-stack-tutorial
    cd elastic-stack-tutorial

  2. 创建 .env 文件:
    此文件将存储环境变量,包括 Elasticsearch 版本和 elastic 用户的密码。请将 your_strong_password_here 替换为安全的密码。
    dotenv
    # .env
    STACK_VERSION=8.12.2
    ELASTIC_PASSWORD=your_strong_password_here

  3. 创建 docker-compose.yml 文件:
    此文件定义了 Elasticsearch 和 Kibana 服务、它们的配置以及它们如何交互。
    “`yaml
    # docker-compose.yml
    version: ‘3.8’

    services:
    elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
    container_name: elasticsearch
    environment:
    – discovery.type=single-node
    – xpack.security.enabled=true # 启用安全
    – ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
    – ES_JAVA_OPTS=-Xms1g -Xmx1g # 分配 1GB 堆内存
    ulimits:
    memlock:
    soft: -1
    hard: -1
    nofile:
    soft: 65536
    hard: 65536
    volumes:
    – elasticsearch-data:/usr/share/elasticsearch/data
    ports:
    – “9200:9200”
    – “9300:9300”
    networks:
    – elastic-net
    healthcheck:
    test: [“CMD-SHELL”, “curl -s –cacert /usr/share/elasticsearch/config/certs/http_ca.crt -u elastic:${ELASTIC_PASSWORD} https://localhost:9200/_cluster/health | grep -q ‘\”status\”:\”green\”‘”]
    interval: 10s
    timeout: 10s
    retries: 120

    kibana:
    image: docker.elastic.co/kibana/kibana:${STACK_VERSION}
    container_name: kibana
    environment:
    – ELASTICSEARCH_HOSTS=https://elasticsearch:9200
    – ELASTICSEARCH_USERNAME=kibana_system
    – ELASTICSEARCH_PASSWORD=${ELASTIC_PASSWORD} # 为简化教程,使用 elastic 密码
    – KIBANA_SYSTEM_PASSWORD=${ELASTIC_PASSWORD} # 用于 Kibana 内部用户
    ports:
    – “5601:5601”
    networks:
    – elastic-net
    depends_on:
    elasticsearch:
    condition: service_healthy
    healthcheck:
    test: [“CMD-SHELL”, “curl -s http://localhost:5601/api/status | grep -q ‘\”overall\”:{\”state\”:\”green\”}'”]
    interval: 10s
    timeout: 10s
    retries: 120

    volumes:
    elasticsearch-data:
    driver: local

    networks:
    elastic-net:
    driver: bridge
    ``
    * **
    elasticsearch服务:**
    *
    image: 使用STACK_VERSION中指定的 Elasticsearch Docker 镜像。
    *
    environment:
    *
    discovery.type=single-node: 用于单节点集群。
    *
    xpack.security.enabled=true: 启用安全功能,这是最新 Elasticsearch 版本的默认设置。这需要身份验证。
    *
    ELASTIC_PASSWORD: 设置内置elastic超级用户的密码。
    *
    ES_JAVA_OPTS: 设置 JVM 堆大小。
    *
    ulimits: 配置容器的资源限制,这对于 Elasticsearch 的稳定性至关重要。
    *
    volumes:elasticsearch-data是一个命名的 Docker 卷,即使容器被移除,也能持久化 Elasticsearch 数据。
    *
    ports: 将容器端口映射到主机端口。
    *
    networks: 连接到elastic-net网络。
    *
    healthcheck: 确保 Elasticsearch 在 Kibana 尝试连接之前完全启动并健康。
    * **
    kibana服务:**
    *
    image: 使用与 Elasticsearch 版本匹配的 Kibana Docker 镜像。
    *
    environment:
    *
    ELASTICSEARCH_HOSTS: 指定 Kibana 连接 Elasticsearch 的 URL。请注意,由于启用了安全功能,此处使用https
    *
    ELASTICSEARCH_USERNAMEELASTICSEARCH_PASSWORDKIBANA_SYSTEM_PASSWORD: Kibana 用于与 Elasticsearch 进行身份验证的凭据。
    *
    ports: 将 Kibana 的 Web 界面端口 (5601) 映射到主机。
    *
    networks: 连接到elastic-net网络。
    *
    depends_on: 确保 Elasticsearch 健康后 Kibana 才启动。
    *
    healthcheck: 确保 Kibana 完全启动并健康。
    * **
    volumesnetworks` 部分:** 定义用于数据持久化的命名卷和用于服务间通信的自定义网络。

  4. 启动 Elastic Stack:
    在终端中导航到您的 elastic-stack-tutorial 目录,并运行:
    bash
    docker compose up -d

    此命令将下载必要的镜像,创建卷和网络,并在分离模式下启动 Elasticsearch 和 Kibana。

  5. 访问 Kibana:
    一旦服务运行(可能需要几分钟才能变得健康),打开您的 Web 浏览器并导航到 http://localhost:5601
    系统将提示您登录。使用用户名 elastic 和您在 .env 文件中设置的 ELASTIC_PASSWORD

  6. 停止并移除 Stack:
    要停止服务:
    bash
    docker compose down

    要停止并移除容器、网络和卷(这将删除您的 Elasticsearch 数据):
    bash
    docker compose down -v

重要注意事项

  • 数据持久性: 始终使用 Docker 卷(如 Docker Compose 示例中所示)来存储 Elasticsearch 数据。如果没有卷,当容器被移除时,您的数据将会丢失。
  • 内存分配: Elasticsearch 是内存密集型应用。请确保您的 Docker Desktop 分配了足够的内存,并相应地配置 ES_JAVA_OPTSvm.max_map_count 设置对于性能和稳定性至关重要。
  • 安全性: 对于生产环境,xpack.security.enabled=true 是必不可少的。您还应该配置 TLS/SSL,使用强密码,并考虑更高级的安全功能。docker run 示例中使用的 xpack.security.enabled=false 设置仅用于快速本地开发。
  • 生产部署: 本教程中描述的单节点设置不适用于生产环境。生产级 Elasticsearch 集群需要多个节点(专用主节点、数据节点和摄入节点)、强大的监控、备份和高级安全配置。
  • 版本兼容性: 始终确保您的 Elasticsearch 和 Kibana 版本兼容。在 .env 文件中使用相同的 STACK_VERSION 有助于保持这种兼容性。

滚动至顶部