Установка 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:
- Создайте файл
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 создаёт их при запуске кластера.
-
Убедитесь, что Docker Engine выделено не менее 4 ГБ оперативной памяти. В Docker Desktop вы настраиваете использование ресурсов на вкладке «Дополнительно» в настройках (macOS) или «Настройки» (Windows).
Docker Compose не предустановлен с Docker на Linux. Обратитесь к документации docs.docker.com для получения инструкций по установке: Установка Compose на Linux
-
Запустите
docker-compose, чтобы запустить кластер:docker-compose up
-
Отправьте запрос
_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:
-
Из командной строки выполните:
screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
-
Нажмите Enter и используйте
sysctlдля настройкиvm.max_map_count:sysctl -w vm.max_map_count=262144
- Чтобы выйти из сессии
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, по следующим причинам:
- Данные вашего узла Elasticsearch не будут потеряны, если контейнер будет убит
- Elasticsearch чувствителен к операциям ввода-вывода, а драйвер хранения Docker не идеально подходит для быстрых операций ввода-вывода
- Это позволяет использовать расширенные плагины томов Docker
Избегайте использования режима loop-lvm
Если вы используете драйвер хранения devicemapper, не используйте режим по умолчанию loop-lvm. Настройте docker-engine для использования direct-lvm.
Централизация логов
Рассмотрите возможность централизации логов, используя другой драйвер ведения журнала. Обратите внимание, что драйвер ведения журнала json-file по умолчанию не подходит для использования в рабочей среде.
Настройка Elasticsearch с Docker
При запуске в Docker, файлы конфигурации Elasticsearch загружаются из /usr/share/elasticsearch/config/.
Для использования пользовательских файлов конфигурации, необходимо подключить файлы к файлам конфигурации в образе.
Вы можете задать отдельные параметры конфигурации Elasticsearch, используя переменные окружения Docker. Пример файла compose и пример одного узла используют этот метод. Вы можете использовать имя настройки напрямую в качестве имени переменной окружения. Если это невозможно, например, потому что ваша платформа оркестрации запрещает точки в именах переменных окружения, то можно использовать альтернативный стиль, преобразовав имя настройки следующим образом.
- Измените имя настройки на верхний регистр
- Добавьте префикс
ES_SETTING_ - Замените все нижние подчеркивания (
_) на двойные - Преобразуйте все точки (
.) в нижние подчеркивания (_)
Например, -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 вместо этого создаёт каталог с таким же именем.
Чтобы исправить эту ошибку:
- Удалите каталог
elasticsearch.keystoreв каталогеconfig. - Обновите флаги
-vили--volume, чтобы указать путь к каталогуconfig, а не путь к файлу хранилища ключей. Пример см. в разделе Создание зашифрованного хранилища ключей Elasticsearch. - Повторите команду.
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.
Чтобы исправить эту ошибку:
- Обновите флаги
-vили--volume, чтобы указать путь к каталогуconfig, а не путь к файлу хранилища ключей. Пример см. в разделе Создание зашифрованного хранилища ключей Elasticsearch. - Повторите команду.
Дальнейшие шаги
Теперь у вас настроена тестовая среда 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