Spec-Zone.ru › Elasticsearch 7
›Руководство по Elasticsearch [7.17] ›Настройка Elasticsearch ›Установка Elasticsearch

Установка Elasticsearch с Docker

Elasticsearch также доступен в виде образов Docker. Список всех опубликованных образов Docker и тегов доступен на сайте www.docker.elastic.co. Исходные файлы находятся в Github.

Этот пакет содержит как бесплатные, так и платные функции. Начните 30-дневную пробную версию, чтобы попробовать все функции.

Загрузка образа

Получение Elasticsearch для Docker так же просто, как выполнение команды docker pull в реестре Docker Elastic.

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

Запуск кластера из одного узла с Docker

Чтобы запустить кластер Elasticsearch из одного узла для разработки или тестирования, укажите обнаружение одного узла, чтобы обойти проверки загрузки:

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

Запуск многоузлового кластера с Docker Compose

Для запуска трехузлового кластера Elasticsearch в Docker можно использовать Docker Compose:

  1. Создайте файл docker-compose.yml:
version: '2.2'
services:
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.17.28
    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.17.28
    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.17.28
    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.yml использует переменную окружения ES_JAVA_OPTS, чтобы вручную установить размер кучи в 512 МБ. Мы не рекомендуем использовать ES_JAVA_OPTS в рабочей среде. См. Вручную задать размер кучи.

Этот примерный файл Docker Compose запускает трехузловой кластер Elasticsearch. Узел es01 прослушивает localhost:9200 и es02 и es03 взаимодействуют с es01 через Docker сеть.

Обратите внимание, что эта конфигурация экспонирует порт 9200 на всех сетевых интерфейсах, и учитывая, как Docker манипулирует iptables в Linux, это означает, что ваш кластер Elasticsearch доступен по сети, потенциально игнорируя настройки брандмауэра. Если вы не хотите экспонировать порт 9200 и вместо этого использовать обратный прокси, замените 9200:9200 на 127.0.0.1:9200:9200 в файле docker-compose.yml. Elasticsearch будет доступен только с самого хоста.

Имена томов Docker data01, data02 и data03 хранят каталоги данных узлов, чтобы данные сохранялись при перезапуске. Если они еще не существуют, docker-compose создаёт их при запуске кластера.

  1. Убедитесь, что Docker Engine выделено не менее 4 ГБ оперативной памяти. В Docker Desktop вы настраиваете использование ресурсов на вкладке «Дополнительно» в настройках (macOS) или «Настройки» (Windows).

    Docker Compose не предустановлен с Docker на Linux. Обратитесь к документации docs.docker.com для получения инструкций по установке: Установка Compose на Linux

  2. Запустите docker-compose, чтобы запустить кластер:

    docker-compose up
  3. Отправьте запрос _cat/nodes, чтобы увидеть, что узлы запущены и работают:

    curl -X GET "localhost:9200/_cat/nodes?v=true&pretty"

Сообщения в логах выводятся в консоль и обрабатываются настроенным драйвером ведения журналов Docker. По умолчанию к логам можно получить доступ с помощью docker logs. Если вы хотите, чтобы контейнер Elasticsearch записывал журналы на диск, задайте переменную окружения ES_LOG_STYLE в значение file. Это заставляет Elasticsearch использовать ту же конфигурацию ведения журналов, что и другие форматы дистрибутивов Elasticsearch.

Чтобы остановить кластер, выполните docker-compose down. Данные в томах Docker сохраняются и загружаются при перезапуске кластера с помощью docker-compose up. Чтобы удалить тома данных при выключении кластера, укажите параметр -v: docker-compose down -v.

Запуск многоузлового кластера с включенным TLS

См. Шифрование сообщений в контейнере Elasticsearch Docker и Запуск Elastic Stack в Docker с включенным TLS.

Использование образов Docker в рабочей среде

Следующие требования и рекомендации применяются при запуске Elasticsearch в Docker в рабочей среде.

Установите vm.max_map_count как минимум на 262144

Настройка ядра vm.max_map_count должна быть установлена как минимум на 262144 для использования в рабочей среде.

Способ установки vm.max_map_count зависит от вашей платформы.

Linux

Чтобы просмотреть текущее значение настройки vm.max_map_count, выполните:

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

Чтобы применить настройку в активной системе, выполните:

sysctl -w vm.max_map_count=262144

Чтобы постоянно изменить значение настройки vm.max_map_count, обновите значение в /etc/sysctl.conf.

macOS с Docker для macOS

Настройка vm.max_map_count должна быть установлена внутри виртуальной машины xhyve:

  1. Из командной строки выполните:

    screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
  2. Нажмите Enter и используйте sysctl для настройки vm.max_map_count:

    sysctl -w vm.max_map_count=262144
  3. Чтобы выйти из сессии screen, введите Ctrl a d.
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 работает внутри контейнера как пользователь elasticsearch с uid:gid 1000:0.

Исключением является Openshift, который запускает контейнеры с произвольно назначенным идентификатором пользователя. Openshift предоставляет постоянные тома с gid, установленным на 0, что работает без каких-либо изменений.

Если вы монтируете локальный каталог или файл, он должен быть доступен для пользователя elasticsearch. Кроме того, этот пользователь должен иметь права записи в каталоги конфигурации, данных и логов (Elasticsearch требует прав записи в каталог config, чтобы создать хранилище ключей). Хорошей стратегией является предоставление группе доступа к gid 0 для локального каталога.

Например, чтобы подготовить локальный каталог для хранения данных через bind-mount:

mkdir esdatadir
chmod g+rwx esdatadir
chgrp 0 esdatadir

Вы также можете запустить контейнер Elasticsearch с настроенным UID и GID. Необходимо убедиться, что права доступа к файлам не помешают Elasticsearch работать. Можно использовать один из двух вариантов:

  • Промонтировать каталоги config, data и logs. Если вы планируете устанавливать плагины и предпочитаете не создавать собственный образ Docker, вам также необходимо смонтировать каталог plugins.
  • Передать параметр командной строки --group-add 0 к docker run. Это гарантирует, что пользователь, под которым работает Elasticsearch, также является членом группы root (GID 0) внутри контейнера.

В крайнем случае, вы можете принудительно изменить владение любых bind-mount, используемых для каталогов данных и логов, через переменную среды TAKE_FILE_OWNERSHIP. В этом случае они будут принадлежать uid:gid 1000:0, что обеспечит необходимые права чтения/записи для процесса Elasticsearch.

Увеличение ограничений ulimits для nofile и nproc

Увеличенные ограничения ulimits для nofile и nproc должны быть доступны для контейнеров Elasticsearch. Проверьте систему инициализации для Docker-демона, чтобы убедиться, что они установлены в приемлемых значениях.

Чтобы проверить значения по умолчанию Docker-демона для ulimits, выполните:

docker run --rm docker.elastic.co/elasticsearch/elasticsearch:{version} /bin/bash -c 'ulimit -Hn && ulimit -Sn && ulimit -Hu && ulimit -Su'

При необходимости настройте их в демоне или переопределите их для каждого контейнера. Например, при использовании docker run, установите:

--ulimit nofile=65535:65535

Отключить подкачку

Подкачка должна быть отключена для обеспечения производительности и стабильности узла. Дополнительную информацию о способах выполнения этой операции см. в разделе Отключение подкачки.

Если вы выбираете подход bootstrap.memory_lock: true, вам также необходимо определить ограничение memlock: true ulimit в Docker-демоне или явно задать его для контейнера, как показано в примере файла 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 ГБ, укажите -e ES_JAVA_OPTS="-Xms16g -Xmx16g" с docker run. Переменная ES_JAVA_OPTS переопределяет все остальные опции JVM. Мы не рекомендуем использовать ES_JAVA_OPTS в рабочей среде. Файл docker-compose.yml выше устанавливает размер кучи в 512 МБ.

Фиксация развертываний на конкретной версии образа

Зафиксируйте свои развертывания на конкретной версии образа Elasticsearch Docker. Например, docker.elastic.co/elasticsearch/elasticsearch:7.17.28.

Всегда монтируйте тома данных

Вы должны использовать объём, привязанный к /usr/share/elasticsearch/data, по следующим причинам:

  1. Данные вашего узла Elasticsearch не будут потеряны, если контейнер будет убит
  2. Elasticsearch чувствителен к операциям ввода-вывода, а драйвер хранения Docker не идеально подходит для быстрых операций ввода-вывода
  3. Это позволяет использовать расширенные плагины томов Docker

Избегайте использования режима loop-lvm

Если вы используете драйвер хранения devicemapper, не используйте режим по умолчанию loop-lvm. Настройте docker-engine для использования direct-lvm.

Централизация логов

Рассмотрите возможность централизации логов, используя другой драйвер ведения журнала. Обратите внимание, что драйвер ведения журнала json-file по умолчанию не подходит для использования в рабочей среде.

Настройка Elasticsearch с Docker

При запуске в Docker, файлы конфигурации Elasticsearch загружаются из /usr/share/elasticsearch/config/.

Для использования пользовательских файлов конфигурации, необходимо подключить файлы к файлам конфигурации в образе.

Вы можете задать отдельные параметры конфигурации Elasticsearch, используя переменные окружения Docker. Пример файла compose и пример одного узла используют этот метод. Вы можете использовать имя настройки напрямую в качестве имени переменной окружения. Если это невозможно, например, потому что ваша платформа оркестрации запрещает точки в именах переменных окружения, то можно использовать альтернативный стиль, преобразовав имя настройки следующим образом.

  1. Измените имя настройки на верхний регистр
  2. Добавьте префикс ES_SETTING_
  3. Замените все нижние подчеркивания (_) на двойные
  4. Преобразуйте все точки (.) в нижние подчеркивания (_)

Например, -e bootstrap.memory_lock=true становится -e ES_SETTING_BOOTSTRAP_MEMORY__LOCK=true.

Вы можете использовать содержимое файла для установки значения переменных окружения ELASTIC_PASSWORD или KEYSTORE_PASSWORD, добавив суффикс _FILE к имени переменной. Это полезно для передачи секретов, таких как пароли, в Elasticsearch без их прямого указания.

Например, для установки пароля bootstrap Elasticsearch из файла, можно подключить файл и установить переменную окружения ELASTIC_PASSWORD_FILE на расположение подключения. Если вы подключаете файл пароля по пути /run/secrets/bootstrapPassword.txt, укажите:

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

Вы можете переопределить команду по умолчанию для образа, чтобы передать параметры конфигурации Elasticsearch в качестве параметров командной строки. Например:

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

Хотя подключение файлов конфигурации — предпочтительный метод в продакшене, вы также можете создать пользовательский образ Docker, содержащий вашу конфигурацию.

Подключение файлов конфигурации Elasticsearch

Создайте пользовательские файлы конфигурации и подключите их к соответствующим файлам в образе Docker. Например, чтобы подключить custom_elasticsearch.yml к docker run, укажите:

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

Если вы подключаете пользовательский файл elasticsearch.yml, убедитесь, что он включает настройку network.host: 0.0.0.0. Эта настройка гарантирует, что узел доступен для HTTP и транспортного трафика, при условии, что его порты открыты. Встроенный файл образа Docker elasticsearch.yml содержит эту настройку по умолчанию.

Контейнер запускает Elasticsearch как пользователь elasticsearch с uid:gid 1000:0. Подключаемые хост-каталоги и файлы должны быть доступны для этого пользователя, а каталоги данных и логов — доступны для записи этим пользователем.

Создание зашифрованного хранилища ключей Elasticsearch

По умолчанию Elasticsearch автоматически создаст файл хранилища ключей для безопасных настроек. Этот файл защищен, но не зашифрован.

Чтобы зашифровать ваши безопасные настройки паролем и сохранить их вне контейнера, используйте команду docker run для ручного создания хранилища ключей. Команда должна:

  • Подключить каталог config. Команда создаст файл elasticsearch.keystore в этом каталоге. Чтобы избежать ошибок, не подключайте напрямую файл elasticsearch.keystore.
  • Использовать инструмент elasticsearch-keystore с опцией create -p. Вас попросят ввести пароль для хранилища ключей.

Например:

docker run -it --rm \
-v full_path_to/config:/usr/share/elasticsearch/config \
docker.elastic.co/elasticsearch/elasticsearch:7.17.28 \
bin/elasticsearch-keystore create -p

Вы также можете использовать команду docker run для добавления или обновления безопасных настроек в хранилище ключей. Вас попросят ввести значения настроек. Если хранилище зашифровано, вас также попросят ввести пароль хранилища ключей.

docker run -it --rm \
-v full_path_to/config:/usr/share/elasticsearch/config \
docker.elastic.co/elasticsearch/elasticsearch:7.17.28 \
bin/elasticsearch-keystore \
add my.secure.setting \
my.other.secure.setting

Если вы уже создали хранилище ключей и не нужно его обновлять, вы можете напрямую подключить файл elasticsearch.keystore. Переменную окружения KEYSTORE_PASSWORD можно использовать для предоставления пароля хранилища ключей контейнеру при запуске. Например, команда docker run может иметь следующие параметры:

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

Использование пользовательских образов Docker

В некоторых средах может быть целесообразнее подготовить пользовательский образ, содержащий вашу конфигурацию. Команда Dockerfile для достижения этой цели может быть такой простой, как:

FROM docker.elastic.co/elasticsearch/elasticsearch:7.17.28
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

Некоторые плагины требуют дополнительных разрешений безопасности. Их необходимо явно принять, либо:

  • Прикрепив tty при запуске образа Docker и разрешив разрешения при запросе.
  • Проверить разрешения безопасности и принять их (если это уместно), добавив флаг --batch в команду установки плагина.

Дополнительную информацию см. в Управлении плагинами.

Устранение ошибок Docker для Elasticsearch

Вот как решить распространённые ошибки при запуске Elasticsearch с Docker.

elasticsearch.keystore — это каталог

Exception in thread "main" org.elasticsearch.bootstrap.BootstrapException: java.io.IOException: Is a directory: SimpleFSIndexInput(path="/usr/share/elasticsearch/config/elasticsearch.keystore") Likely root cause: java.io.IOException: Is a directory

Команда docker run, связанная с хранилищем ключей, попыталась напрямую подключить файл elasticsearch.keystore, которого не существует. Если вы используете флаги -v или --volume для подключения файла, которого не существует, Docker вместо этого создаёт каталог с таким же именем.

Чтобы исправить эту ошибку:

  1. Удалите каталог elasticsearch.keystore в каталоге config.
  2. Обновите флаги -v или --volume, чтобы указать путь к каталогу config, а не путь к файлу хранилища ключей. Пример см. в разделе Создание зашифрованного хранилища ключей Elasticsearch.
  3. Повторите команду.

elasticsearch.keystore: Устройство или ресурс занят

Exception in thread "main" java.nio.file.FileSystemException: /usr/share/elasticsearch/config/elasticsearch.keystore.tmp -> /usr/share/elasticsearch/config/elasticsearch.keystore: Device or resource busy

Команда docker run попыталась обновить хранилище ключей, напрямую подключив файл elasticsearch.keystore. Для обновления хранилища ключей контейнеру требуется доступ к другим файлам в каталоге config, таким как keystore.tmp.

Чтобы исправить эту ошибку:

  1. Обновите флаги -v или --volume, чтобы указать путь к каталогу config, а не путь к файлу хранилища ключей. Пример см. в разделе Создание зашифрованного хранилища ключей Elasticsearch.
  2. Повторите команду.

Дальнейшие шаги

Теперь у вас настроена тестовая среда Elasticsearch. Перед началом серьёзной разработки или переходом в продакшен с Elasticsearch, необходимо выполнить дополнительную настройку:

  • Настройте Elasticsearch.
  • Настройте важные настройки Elasticsearch.
  • Настройте важные системные настройки.

© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/docker.html

END_OF_DOCUMENT_MARKER

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API