使用Docker安装Elasticsearch-《elasticsearch中文文档帮助手册教程V7.11》

admin 2025-11-04 00:22:46 数据库 来源:ZONE.CI 全球网 0 阅读模式
  • 使用 Docker 安装 Elasticsearch
    • 拉取镜像
    • 使用 Docker 启动单节点集群
    • 使用 Docker Compose 启动多节点集群
      • 启动开启 TLS 的多节点集群
    • 在生产环境使用 Docker 镜像
      • 设置 vm.max_map_count 至少为 262144
      • 配置文件必须可被用户 elasticsearch 用户读取
      • 为 nofile 和 nproc 增加 ulimit
      • 禁用 swapping
      • 随机发布端口
      • 手工设置堆大小
      • 部署固定为指定的镜像版本
      • 始终绑定数据卷
      • 禁止使用 loop-lvm 模式
      • 集中你的日志
    • 使用 Docker 配置 Elasticsearch
      • 挂载 Elasticsearch 配置文件
      • 挂载 Elasticsearch 密钥库
      • 使用自定义 Docker 镜像
    • 下一步

    使用 Docker 安装 Elasticsearch

    Elasticsearch 也提供 Docker 镜像。镜像使用 centos:8 作为基础镜像。

    所有已发布的 Docker 镜像列表和版本都在 www.docker.elastic.co 上。源文件在 github。

    软件包包含免费和订阅的特性。开始 30 天的试用,尝试所有功能。

    拉取镜像

    Docker 上获取 Elasticsearch,简单到只要向 Elastic Docker 仓库发出 docker pull 命令一样。

    1. docker pull docker.elastic.co/elasticsearch/elasticsearch:7.11.2

    使用 Docker 启动单节点集群

    要启动单节点 Elasticsearch 集群进行开发或测试,请指定单节点发现以绕过启动检查:

    1. docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.11.2

    使用 Docker Compose 启动多节点集群

    为了在 Docker 中启动和运行一个三节点 Elasticsearch 集群,你可以使用 Docker Compose:

    • 创建一个 docker-compose.yml 文件:
    1. version: '2.2'
    2. services:
    3. es01:
    4. image: docker.elastic.co/elasticsearch/elasticsearch:7.11.2
    5. container_name: es01
    6. environment:
    7. - node.name=es01
    8. - cluster.name=es-docker-cluster
    9. - discovery.seed_hosts=es02,es03
    10. - cluster.initial_master_nodes=es01,es02,es03
    11. - bootstrap.memory_lock=true
    12. - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    13. ulimits:
    14. memlock:
    15. soft: -1
    16. hard: -1
    17. volumes:
    18. - data01:/usr/share/elasticsearch/data
    19. ports:
    20. - 9200:9200
    21. networks:
    22. - elastic
    23. es02:
    24. image: docker.elastic.co/elasticsearch/elasticsearch:7.11.2
    25. container_name: es02
    26. environment:
    27. - node.name=es02
    28. - cluster.name=es-docker-cluster
    29. - discovery.seed_hosts=es01,es03
    30. - cluster.initial_master_nodes=es01,es02,es03
    31. - bootstrap.memory_lock=true
    32. - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    33. ulimits:
    34. memlock:
    35. soft: -1
    36. hard: -1
    37. volumes:
    38. - data02:/usr/share/elasticsearch/data
    39. networks:
    40. - elastic
    41. es03:
    42. image: docker.elastic.co/elasticsearch/elasticsearch:7.11.2
    43. container_name: es03
    44. environment:
    45. - node.name=es03
    46. - cluster.name=es-docker-cluster
    47. - discovery.seed_hosts=es01,es02
    48. - cluster.initial_master_nodes=es01,es02,es03
    49. - bootstrap.memory_lock=true
    50. - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    51. ulimits:
    52. memlock:
    53. soft: -1
    54. hard: -1
    55. volumes:
    56. - data03:/usr/share/elasticsearch/data
    57. networks:
    58. - elastic
    59. volumes:
    60. data01:
    61. driver: local
    62. data02:
    63. driver: local
    64. data03:
    65. driver: local
    66. networks:
    67. elastic:
    68. driver: bridge

    ?> 例子中的 docker-compose.yml 使用环境变量 ES_JAVA_OPTS 手工设置堆大小为 512 MB。我们不推荐在生产环境使用 ES_JAVA_OPTS。参看手工设置堆大小。

    这个示例 Docker Compose 文件,提供了一个三节点 Elasticsearch 集群。节点 es01 监听 localhost:9200es02es03 通过 Docker 网络与 es01 通信。

    请注意此配置在所有网络接口上暴露端口 9200,并且考虑到 Docker 怎么在 Linux 上操作 iptables,这意味着你的 Elasticsearch 集群可以公开访问,可能会忽略任何防火墙设置。如果你不想暴露端口 9200,转而使用反向代理,在 docker-compose.yml 文件中用 127.0.0.1:9200:9200 替代 9200:9200。Elasticsearch 将只能从主机自身访问。

    Docker 命名卷 data01data02data03 存储节点数据目录,以便重启时数据持续存在。如果他们不存在,docker-compose 将会在你创建集群时创建他们。

    1. 确保 Docker Engine 分配了至少 4 GiB 内存。在 Docker 桌面中,你可以在首选项(macOS)或设置(Windows)的高级选项卡中配置资源使用。

    ?> 在 Linux 上,Docker Compose 未与 Docker 一起预装。在 docs.docker.com 查看安装指南:在 Linux 安装 Compose

    1. 运行 docker-compose 以启动集群:
    1. docker-compose up
    1. 提交请求 _cat/nodes 查看节点是否启动运行
    1. curl -X GET "localhost:9200/_cat/nodes?v=true&pretty"

    日志消息进入控制台,由配置的 Docker 日志驱动处理。默认情况下,你可以使用 docker logs 访问日志。如果你更想 Elasticsearch 容器把日志写入磁盘,设置环境变量 ES_LOG_STYLEfile。这将导致 Elasticsearch 使用与其他 Elasticsearch 分发格式相同的配置。

    要停止集群,运行 docker-compose down。当你使用 docker-compose up 重启集群,Docker 卷中的数据将被保存和加载。为了在停止集群时删除数据卷,指定 -v 选项: docker-compose down -v

    启动开启 TLS 的多节点集群

    参阅 在Elasticsearch Docker 容器的加密通信和在 Docker 中开启 TLS 运行 Elastic 栈。

    在生产环境使用 Docker 镜像

    以下要求和建议适用于生产环境中在 Docker 中运行 Elasticsearch。

    设置 vm.max_map_count 至少为 262144

    在生产环境使用,vm.max_map_count 内核设置必须至少为 262144

    如何设置 vm.max_map_count 基于你的平台:

    • Linux

    vm.max_map_count 应该永久设置在 /etc/sysctl.conf

    1. grep vm.max_map_count /etc/sysctl.conf
    2. vm.max_map_count=262144

    在运行的系统中应用此配置,执行:

    1. sysctl -w vm.max_map_count=262144
    • 带 Mac 版 Docker 的 macOS

    vm.max_map_count 设置必须在 xhyve 虚机中设置:

    a. 从命令行运行:

    1. screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty

    b. 按回车,使用 “sysctl” 配置 vm.max_map_count

    1. sysctl -w vm.max_map_count=262144

    c. 退出 screen 会话,按 Ctrl a d

    • 带 Docker 桌面版的 Windows 和 macOS

    vm.max_map_count 必须通过 docker-machine 设置。

    1. docker-machine ssh
    2. sudo sysctl -w vm.max_map_count=262144
    • 带 Docker WSL 2 后端桌面版的 Windows

    vm.max_map_count 必须在 docker-desktop 容器中设置。

    1. wsl -d docker-desktop
    2. sysctl -w vm.max_map_count=262144

    配置文件必须可被用户 elasticsearch 用户读取

    默认情况下,Elasticsearch 通过 uid:gid 1000:0,以用户 elasticsearch 在容器中运行。

    !> 一个例外是 OpenShift,它使用任意分配的用户 ID 运行容器。OpenShift 显示的持久卷的 gid 设置为 0,它可以无需调整的运行。

    如果你要绑定挂载本地目录或文件,它必须可被用户 elasticsearch 读取。此外,此用户对 配置、数据和日志目录有写权限(Elasticsearch 需要对 config 目录有写权限,这样它才能生成密钥库)。一个好的策略是为本地目录 gid 0 分配组访问权限。

    例如,要准备本地目录以通过绑定挂载来存储数据,按以下操作:

    1. mkdir esdatadir
    2. chmod g+rwx esdatadir
    3. chgrp 0 esdatadir

    你也可以使用自定义 UID 和 GID 来运行 Elasticsearch 容器。除非你绑定挂载每个 configdatalogs 目录,否则必须为 docker run 传递命令行选项 --group-add 0。这样可以确保运行 Elasticsearch 的用户也是容器 root (GID 0)组的成员。

    最后,你还可以通过环境变量 TAKE_FILE_OWNERSHIP 强制容器更改用于数据和日志目录的绑定挂载的所有权。当你这样做的时候,它们将属于 uid:gid 1000:0,它提供了 Elasticsearch 进程所需的读写访问权限。

    为 nofile 和 nproc 增加 ulimit

    必须为 Elasticsearch 容器提供 nofile 和 nproc 增加 ulimit。验证 Docker 的守护进程是否的 init system 是否将它们设置为可接受的值。

    为了检测 Docker 守护进程默认的 ulimit,执行:

    1. docker run --rm centos:8 /bin/bash -c 'ulimit -Hn && ulimit -Sn && ulimit -Hu && ulimit -Su'

    如果需要,在守护进程中调整他们,或者在每个容器中重载他们。例如,使用 docker run 时,设置:

    1. --ulimit nofile=65535:65535

    禁用 swapping

    为了提高性能和节点稳定性,swapping 需要禁用。有关执行此操作的更多信息,请参阅 禁用 swapping。

    如果你选择 bootstrap.memory_lock: true,你也需要在 Docker 守护进程中定义 memlock: true 限定,或者如示例 compose 文件中显示的设置。当使用 docker run,你可以指定:

    -e "bootstrap.memory_lock=true" --ulimit memlock=-1:-1

    随机发布端口

    镜像暴露 TCP 端口 9200 和 9300。对生产环境集群,推荐通过 --publish-all 随机发布端口,除非你为每个主机固定一个容器。

    手工设置堆大小

    默认情况下,Elasticsearch 基于节点的角色和节点容器总可用内存,自动地设置 JVM 堆。对大多数生产环境,我们推荐默认大小设置。如果有需要,你可以通过手工设置 JVM 堆大小来重载默认设置。

    为了在生产环境手工设置堆大小,绑定挂载包含了你期望的堆大小设置的 JVM 选项文件(在 /usr/share/elasticsearch/config/jvm.options.d中)。

    用于测试的话,你可以通过环境变量 ES_JAVA_OPTS 手工设置堆大小。例如,要用 16 GB,通过 docker run 指定 -e ES_JAVA_OPTS="-Xms16g -Xmx16g"ES_JAVA_OPTS 重载所有其他 JVM 选项。在生产环境,我们不推荐使用 ES_JAVA_OPTS。上方的 docker-compose.yml 可以看到设置堆大小为 512 MB。

    部署固定为指定的镜像版本

    将部署固定为指定的 Elasticsearch Docker 镜像。例如 docker.elastic.co/elasticsearch/elasticsearch:7.11.2

    始终绑定数据卷

    出于以下原因,你应该对 /usr/share/elasticsearch/data 使用卷绑定:

    1. 如果容器被杀死,Elasticsearch 节点数据不会丢失
    2. Elasticsearch 对 I/O 敏感,而 Docker 存储驱动不适合快速 I/O
    3. 允许使用高级 Docker 卷插件

    禁止使用 loop-lvm 模式

    如果你正在使用 devicemapper 存储驱动,不要使用默认的 loop-lvm 模式。配置 docker-engine 以使用 direct-lvm。

    集中你的日志

    考虑使用不同的日志驱动来集中日志。还要注意,默认的 json-file 日志驱动不适合生产环境。

    使用 Docker 配置 Elasticsearch

    当你在 Docker 中运行时, Elasticsearch 配置文件从 /usr/share/elasticsearch/config/ 加载。为了使用自定义配置文件,你要绑定挂载文件到镜像中的配置文件上。

    你可以通过环境变量设置独立的 Elasticsearch 配置参数。示例 compose 文件和单节点示例就用的这种方法。

    要使用文件内容设置环境变量,给环境变量名字加上后缀 _FILE。这对于秘密传输配置(如密码)给 Elasticsearch,而不是直接指定它们非常有用。

    例如,为了从文件设置 Elasticsearch 的启动密码,你可以绑定挂载这个文件,然后在挂载路径中设置环境变量ELASTIC_PASSWORD_FILE。如果你挂载的密码文件为 /run/secrets/bootstrapPassword.txt,如下指定:

    1. -e ELASTIC_PASSWORD_FILE=/run/secrets/bootstrapPassword.txt

    你还可以通过传递 Elasticsearch 配置参数作为命令行选项,来重载默认的命令。例如:

    1. docker run <various parameters> bin/elasticsearch -Ecluster.name=mynewclustername

    虽然绑定挂载配置文件通常在生产环境是首选方法,你也可以创建包含你自己配置的自定义 Docker 镜像。

    挂载 Elasticsearch 配置文件

    创建自定义配置文件,将其绑定挂载到 Docker 镜像的相应文件上。例如,使用 docker run 绑定挂载 custom_elasticsearch.yml,如下指定:

    1. -v full_path_to/custom_elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml

    !> 容器以用户 elasticsearch,使用 uid:gid 1000:0 运行 Elasticsearch。绑定挂载的主机目录和文件,必须能被此用户访问,且数据和日志目录必须能被此用户写入。

    挂载 Elasticsearch 密钥库

    默认情况下,Elasticsearch 会为安全设置自动生成密钥库文件。这个文件是混淆的,但没有加密。如果你想使用密码加密你的安全设置,你必须使用 elasticsearch-keystore 程序去创建一个密码保护的密钥库,然后绑定挂载它到容器中文件 /usr/share/elasticsearch/config/elasticsearch.keystore。为了在启动时向 Docker 容器提供密码,将 Docker 的环境变量值 KEYSTORE_PASSWORD 设置为密码值。例如,docker run 命令可以有以下的选项:

    1. -v full_path_to/elasticsearch.keystore:/usr/share/elasticsearch/config/elasticsearch.keystore
    2. -E KEYSTORE_PASSWORD=mypassword

    使用自定义 Docker 镜像

    在一些环境中,准备包含你配置的自定义镜像更有意义。实现这一点的 Dockerfile 可能如下一样简单:

    1. FROM docker.elastic.co/elasticsearch/elasticsearch:7.11.2
    2. COPY --chown=elasticsearch:elasticsearch elasticsearch.yml /usr/share/elasticsearch/config/

    你可以这样构建和运行镜像:

    1. docker build --tag=elasticsearch-custom .
    2. docker run -ti -v /usr/share/elasticsearch/data elasticsearch-custom

    一些插件需要额外的安全权限。你必须通过以下方式明确接受它们:

    • 当你运行 Docker 镜像时,附加 tty 并在提供时允许权限。
    • 通过向插件安装命令添加 --batch 标志来检查安全权限,并且接受它们(如果合适)

    参阅插件管理,获取更多信息。

    下一步

    你现在有一个测试 Elasticsearch 环境部署好。在你使用 Elasticsearch 正式开始开发或者生产之前,你必须做一些额外的设置:

    • 学习如何配置 Elasticsearch。
    • 配置重要的 Elasticsearch 设置。
    • 配置重要的系统设置。

    原文链接

    评论:0   参与:  25