Я работаю над проектом, используя эластичный стек, elasticsearch logstash и kibana. Теперь цель состоит в том, чтобы использовать докер для запуска стека. на основе этого https://github.com/deviantony/docker-elk я настроил docker-compose для запуска собственных конвейеров с собственным разбором.
Проблема, с которой я столкнулся, - это автоматическая настройка (создание шаблонов индексов и/или индексов). Я знаю, что использую curl для выполнения вызовов API, после поиска я узнал о сценарии оболочки точки входа, я попытался скопировать сценарий из официального образа и добавить туда свои вызовы curl -XPUT, но это не работает. Поэтому моим следующим рефлексом было открыть интерфейс командной строки и ввести вызовы curl, и он отлично работает.
Итак, мой вопрос: как я могу автоматически запускать вызовы API при запуске контейнера, я новичок в докере и эластичном стеке.
Спасибо !
Обновлено:
Итак, я заработал с базовым образом bash и curl, установленным с помощью команды RUN в моем Dockerfile.
теперь у меня проблема с обменом данными со службами (я поместил их всех в одну сеть), я, вероятно, делаю это неправильно, поэтому я получаю:
curl: (7) Failed to connect to localhost port 9200: Connection refused
редактировать :
обновил мои сценарии для вызова elasticsearch: 9200 без раскрытия портов, и теперь он работает нормально!
я также думаю, что скрипт не ждет, когда elasticsearch закончит выполнение скрипта.
Вот мой файл для создания докеров:
version: '3.2'
services:
elasticsearch:
build:
context: elasticsearch/
args:
ELK_VERSION: $ELK_VERSION
volumes:
- type: bind
source: ./elasticsearch/config/elasticsearch.yml
target: /usr/share/elasticsearch/config/elasticsearch.yml
read_only: true
- type: volume
source: elasticsearch
target: /usr/share/elasticsearch/data
ports:
- "9200:9200"
- "9300:9300"
environment:
ES_JAVA_OPTS: "-Xmx256m -Xms256m"
ELASTIC_PASSWORD: changeme
# Use single node discovery in order to disable production mode and avoid bootstrap checks.
# see: https://www.elastic.co/guide/en/elasticsearch/reference/current/bootstrap-checks.html
discovery.type: single-node
networks:
- elk
configurator:
build:
context: configurator/
networks:
- elk
depends_on:
- elasticsearch
logstash:
build:
context: logstash/
args:
ELK_VERSION: $ELK_VERSION
volumes:
- type: bind
source: ./logstash/config
target: /usr/share/logstash/config
read_only: true
- type: bind
source: ./logstash/pipeline
target: /usr/share/logstash/pipeline
read_only: true
- type: bind
source: ./logstash/data
target: /usr/share/logstash/data
ports:
- "5044:5044"
- "5000:5000/tcp"
- "5000:5000/udp"
- "9600:9600"
environment:
LS_JAVA_OPTS: "-Xmx256m -Xms256m"
networks:
- elk
depends_on:
- configurator
kibana:
build:
context: kibana/
args:
ELK_VERSION: $ELK_VERSION
volumes:
- type: bind
source: ./kibana/config/kibana.yml
target: /usr/share/kibana/config/kibana.yml
read_only: true
ports:
- "5601:5601"
networks:
- elk
depends_on:
- configurator
networks:
elk:
driver: bridge
volumes:
elasticsearch:
Создайте новый образ docker ручной работы (или используйте хороший стартовый образ), добавьте вызовы API, которые необходимо выполнить при запуске, в сценарий запуска. Убедитесь, что он проверяет, нужно ли выполнять вызовы или все уже сделано предыдущим запуском.
Затем добавьте изображение в композицию и сделайте его зависимым от сервиса elasticsearch с опцией depends_on
. Это гарантирует, что ваш кластер будет запущен до запуска вашего «контейнера инициализации».
Теперь при запуске будут запущены нужные службы (если они еще не запущены) и после этого запустится init контейнер.
Необязательно: сделайте так, чтобы контейнер инициализации не запускался по умолчанию, а только в том случае, если он явно запущен. Например, посмотрите на службу монитора и опцию с поддержкой x здесь
Хорошей практикой является добавление проверок здоровья к услугам. Если вы этого не сделаете, докер будет считать работоспособность службы только по состоянию контейнера (работает = исправен). Но у elasticsearch есть более длинная процедура начальной загрузки, которую нам нужно дождаться.
Добавьте следующее в elasticsearch:
healthcheck:
test: ["CMD-SHELL", "curl --silent --fail localhost:9200/_cluster/health || exit 1"]
interval: 30s
timeout: 30s
retries: 5
И добавьте это в сервис конфигуратора:
depends_on:
elasticsearch:
condition: service_healthy
О, теперь я понял, вы имеете в виду новый образ только с ОС, а не с эластичным поиском, он будет работать на нем и вернется сюда!
Точно, просто минимальное изображение с поддержкой завитков и т. д.
я использовал изображение, которое поставляется с bash curl и SSL, но как только начинается компоновка, запускаются все остальные изображения, кроме этого, и я понятия не имею, почему!
могу я попросить compose.yml?
я вернулся, счастливых праздников, так что мой образ работает, теперь у меня проблемы с выполнением и сетью, я обновляю пост!
Счастливых праздников! вероятно, это просто проблема времени / условия гонки. служба конфигуратора запускается, как только elasticsearch становится доступным, но все еще загружается. рекомендуется добавлять проверки работоспособности к службам. Я обновлю свой ответ, чтобы показать использование проверки работоспособности.
Спасибо за советы и информацию! я почти там! теперь мне приходится иметь дело с сетевыми проблемами, curl не удалось подключиться к хосту, если я запускаю те же вызовы curl на хосте (моя машина), он работает нормально, но я не могу заставить его работать из контейнера (службы) в другой.
служба конфигуратора предоставляет тот же порт, что и служба elasticssearch (9200:9200) - это не может работать. Можете ли вы также уточнить, какой вызов (пример) работает с вашего хоста, но не работает со службой (какая служба)?
поэтому, если я правильно понимаю, для elasticsearch мы делаем хост 9200 эквивалентным локальному (контейнеру) 9200, в моем сценарии мои вызовы curl относятся к localhost: 9200, я удалил часть портов в своих тестах, но цель здесь в том, что я могу вызвать хостам 9200, поэтому я должен сделать порты: 9200:some_other_port_locally? (я пробовал это, и я все еще получаю отказ в соединении)
Поскольку обе службы находятся в одной и той же сети elk, они видны и доступны друг для друга по имени службы, которое вы использовали в файле compse. поэтому, если вы хотите вызвать elasticsearch из конфигуратора, используйте в скрипте asticsearch:9200 . вам даже не нужно раскрывать какой-либо порт, так как все порты по умолчанию видны и в сети elk. Только если вам нужна служба, доступная с вашего хоста, вам нужно будет открыть порт, чтобы вызвать kibana, например, с помощью localhost: 5601.
проверка здоровья elasticsearch использует localhost:9200, так как ссылается на себя. конфигуратор должен вызвать elasticsearch:9200, так как он относится к другому сервису в той же сети. и сформируйте свою машину, вам нужно использовать locahost плюс порт, который вы указали, который является localhost: 5601 в случае kibanas
я пробовал это (без раскрытия портов и вызовом elasticsearch: 9200), но это не сработало, я удалил все и снова построил, и теперь он работает, как и ожидалось! спасибо за помощь и терпение!
Ваше здоровье! Отличная работа! Веселиться!
привет, спасибо, что нашли время ответить, но не могли бы вы более подробно рассказать о сценариях запуска, в этом я не уверен. (потому что изображение, которое я использую, извлекает официальное изображение из эластичного)