[译]使用Docker安装Elasticsearch

使用Docker安装Elasticsearch

Elasticsearch也可以以docker镜像的形式使用。该镜像以Centos:8做为基础镜像。

在www.docker.elastic.co上有完整的已发布的docker镜像和标签。相关的源文件在Github上。

这些镜像在Elastic许可(Elastic License)下是免费使用的。他们包含了开源的和免费的商业化的特性还有访问付费商业功能。

拉取镜像

获取 Elasticsearch for Docker 就像针对 Elastic Docker 注册表发出 docker pull 命令一样简单

docker pull docker.elastic.co/elasticsearch/elasticsearch:7.10.2

或者,您可以下载仅包含 Apache 2.0 许可证下可用功能的其他 Docker 映像。

使用Docker启动单节点集群

启动一个单节点的Elasticsearch集群作为学习和测试,指定单节点发现以绕过引导程序检查:

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

使用Docker compose启动多节点集群

使用Docker启动一个三节点的Elasticsearch集群,你需要使用Docker Compose

  1. 创建一个docker-compose.yml文件:
version: '2.2'
services:
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.10.2
    container_name: es01
    environment:
      - node.name=es01
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es02,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data01:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - elastic
  es02:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.10.2
    container_name: es02
    environment:
      - node.name=es02
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es01,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data02:/usr/share/elasticsearch/data
    networks:
      - elastic
  es03:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.10.2
    container_name: es03
    environment:
      - node.name=es03
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es01,es02
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data03:/usr/share/elasticsearch/data
    networks:
      - elastic

volumes:
  data01:
    driver: local
  data02:
    driver: local
  data03:
    driver: local

networks:
  elastic:
    driver: bridge

该Docker Compose示例文件启动了一个三节点的Elasticsearch集群。节点es01监听localhost:9200端口,es02es03在Docker网络上与es01进行交互。

请注意该配置将会在所有网络实例上暴露端口9200,并且鉴于Docker如何在Linux上操作iptables,这意味着您的Elasticsearch集群可公开访问,可能会忽略任何防火墙设置。

如果您不想公开端口9200而是使用反向代理,将docker-compose.yml文件中的9200:9200替换为127.0.0.1:9200:9200。然后只能从主机本身访问Elasticsearch。

Docker命名了data01data02data03卷来存储节点数据目录,以便数据在重启后仍然存在。如果它们不存在docker-compose会在您启动集群时创建它们。

  1. 确保为Docker引擎分配了至少4GB的内存。在桌面版的Docker中,您可以在首选项 (Preference-macOS) 或设置 (Settings-Windows) 的高级选项卡上配置资源使用情况。

注意
Docker Compose在Linux上没有预装Docker
有关安装说明,请参阅 docs.docker.com:
在Linux上安装Compose

  1. 运行docker-compose启动集群
docker-compose up
  1. 发送一个_cat/nodes请求去查看启动并运行的节点
curl -X GET "localhost:9200/_cat/nodes?v=true&pretty"

日志消息进入控制台并由配置的Docker日志驱动程序处理。默认情况下,您可以使用docker logs访问日志。

使用docker-compose down停止集群。当您使用docker-compose up重新启动集群时,Docker卷中的数据将被保留和加载。要在关闭集群时删除数据卷,请指定-v选项: docker-compose down -v

启动一个多节点集群并开启TLS

请查看在Elasticsearch Docker容器中加密通信和在启用TLS的Docker中运行Elastic Stack。

在生产环境中使用Docker镜像

在生产环境中在Docker中运行Elasticsearc 时,以下要求和建议适用。

vm.max_map_count设置为至少262144

vm.max_map_count内核设置必须至少设置为262144才能用于生产。

您如何设置vm.max_map_count取决于您的平台:

  • Linux:

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

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

要在实时系统上应用设置,请运行:

sysctl -w vm.max_map_count=262144
  • macOS(Docker for Mac):

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

  1. 从命令行运行:
screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
  1. 按回车并使用sysctl配置vm.max_map_count
sysctl -w vm.max_map_count=262144
  1. 键入Ctrl a d .退出screen会话
  • Windows / macOS(Docker Desktop)

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

docker-machine ssh
sudo sysctl -w vm.max_map_count=262144
  • Windows(Docker Desktop WSL 2 backend)

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

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

配置文件必须对elasticsearch用户可读

默认情况下,Elasticsearch使用uid:gid 1000:0作为用户elasticsearch在容器内运行。

重要:
一个例外是 Openshift,它使用任意分配的用户 ID 运行容器。
Openshift 呈现持久卷,gid 设置为 0,无需任何调整即可工作。

如果您要绑定挂载本地目录或文件,则elasticsearch用户必须可以读取它。此外,此用户必须具有对数据和日志目录的写访问权限。一个好的策略是授予组访问本地目录的 gid 0的权限。

例如,通过绑定挂载准备一个本地目录用于存储数据:

mkdir esdatadir
chmod g+rwx esdatadir
chgrp 0 esdatadir

作为最后的手段,您可以强制容器通过环境变量TAKE_FILE_OWNERSHIP改变用于数据和日志目录的任何绑定安装的所有权。执行此操作时,它们将归 uid:gid 1000:0所有,它提供对 Elasticsearch 进程所需的读/写访问权限。

为nofile和nproc增加ulimits

增加的nofile和nproc的ulimit必须可用于Elasticsearch容器。验证Docker守护程序的初始化系统是否将它们设置为可接受的值。

要检查ulimit的 Docker守护程序默认值,请运行:

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

如果需要,请在守护程序中调整它们或按容器覆盖它们。 例如,在使用docker run时,设置:

--ulimit nofile=65535:65535

禁用交换分区

为了性能和节点稳定性,需要禁用交换分区。有关执行此操作的方法的信息,请参阅禁用交换分区。

如果您设置了bootstrap.memory_lock: true,您还需要在 Docker Daemon 中定义ulimit memlock: true,或者为容器显式设置如示例compose文件中所示。当使用docker run命令时,你可以指定:

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

随机化发布端口

该镜像暴露出TCP端口92009300。针对生产环境的集群,建议使用--publish-all随机化已发布的端口,除非您为每个主机固定一个容器。

设置堆大小

设置堆的大小,你可以绑定挂载一个JVM配置文件在/usr/share/elasticsearch/config/jvm.options.d下,它包含您所需的堆大小设置。

请注意,根jvm.options文件默认设置堆大小为1GB,任何你设置到绑定挂载的JVM配置文件中的值都将覆盖它。

虽然通过绑定安装的 JVM 选项设置堆大小是推荐的方法,但是你依然可以通过使用ES_JAVA_OPTS环境变量来设置堆大小来配置它。例如,要使用 16 GB,请在docker run中指定-e ES_JAVA_OPTS="-Xms16g -Xmx16g"。请注意,虽然默认根 jvm.options 文件将默认堆设置为 1 GB,但您在ES_JAVA_OPTS中设置的任何值都将覆盖它。上面的 docker-compose.yml 文件将堆大小设置为 512 MB。

重要
即使限制对容器的内存访问,也必须配置堆大小。

固定开发环境为一个指定版本的镜像

将您的开发环境固定到特定版本的 Elasticsearch Docker镜像。比如docker.elastic.co/elasticsearch/elasticsearch:7.10.2

总是绑定数据卷

出于以下原因,您应该绑定使用在/usr/share/elasticsearch/data上的卷:

  1. 你得Elasticsearch节点的数据即使在容器被强制杀死也不应该丢失
  2. Elasticsearch是I/O密集型,Docker存储驱动程序不适合快速I/O
  3. 它允许使用高级Docker 卷插件

避免使用loop-lvm模式

如果您使用的是设备映射器存储驱动程序,请不要使用默认的loop-lvm模式。 配置docker-engine以使用direct-lvm。

集中你的日志

考虑使用不同的日志驱动程序来集中日志。另外请注意,默认的json-file日志驱动程序并不适合生产环境使用。

使用Docker配置Elasticsearch

当你在Docker中运行时,Elasticsearch的配置文件是从/usr/share/elasticsearch/config/中进行加载的。

要使用自定义的配置文件,你需要绑定挂载镜像中的配置文件。

您可以使用Docker环境变量设置单独的Elasticsearch配置参数。示例compose文件和单节点示例就是用的这个方法。

要使用文件的内容来设置环境变量,请在环境变量名称后加上_FILE。这对于将密码等秘钥传递给Elasticsearch而不直接指定它们很有用。

例如,要从文件内容设置Elasticsearch引导程序密码,您可以绑定挂载文件并将ELASTIC_PASSWORD_FILE环境变量设置为挂载位置。如果将密码文件挂载到/run/secrets/bootstrapPassword.txt,请指定:

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

您还可以覆盖镜像的默认命令以将 Elasticsearch 配置参数作为命令行选项传递。 例如:

docker run  bin/elasticsearch -Ecluster.name=mynewclustername

虽然绑定挂载您的配置文件通常是生产中的首选方法,但您也可以创建一个自定义Docker镜像来包含您的配置的。

挂载Elasticsearch配置文件

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

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

重要
该容器使用elasticsearch用户(uid:gid 1000:0)运行Elasticsearch。
绑定挂载的主机目录和文件必须可由该用户访问,并且数据和日志目录必须可由该用户写入。

挂载一个Elasticsearch的keystore

默认的,Elasticsearch会自动的生成一个keystore文件来存储安全配置。此文件已经被混淆,但是未被加密。如果你想用一个密码对你的安全配置进行加密,那你必须使用elasticsearch-keystore实用程序来创建收密码保护的keystore,并将其作为/usr/share/elasticsearch/config/elasticsearch.keystore绑定挂载到容器。为了在启动时为 Docker 容器提供密码,请将 Docker 环境值 KEYSTORE_PASSWORD设置为您的密码值。例如,一个docker run命令可能包含如下配置:

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

使用自定义的Docker镜像

在某些环境中,可能准备一个包含自己定义的配置的镜像会很有用。一个最简单的实现该功能的Dockerfile如下:

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

之后你就可以构建并运行它了:

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

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

  • 在运行Docker镜像时附加tty并在出现提示时允许权限。
  • 通过将--batch标志添加到插件安装命令来检查安全权限并接受它们(如果适用)。

有关更多信息,请参阅插件管理。

下一步

您现在已经设置了一个测试的Elasticsearch环境。在开始认真的开发或使用Elasticsearch投入生产之前,您必须进行一些额外的设置:

  • 了解如何配置Elasticsearch
  • 配置关键的Elasticsearch
  • 配置重要的系统配置

你可能感兴趣的:(ELK,elk,elasticsearch,elastic,stack,大数据)