Назад | Перейти на главную страницу

контейнер docker-compose ELK не запускается

Я развертываю стек из 5 приложений для создания докеров на одном хосте AWS EC2 с 32 ГБ оперативной памяти. Сюда входят: 2 контейнера Java, 2 контейнера Rails, 1 контейнер Elasticsearch / Logstash / Kibana (ELK) (из https://hub.docker.com/r/sebp/elk/).

Когда я впервые поднимаю стопку, запускаются все контейнеры. Для запуска контейнера ELK требуется около 3 минут. Остальные подходят сразу.

Но контейнеры ELK выходят примерно через 5 минут. Я вижу из журналов, что служба elasticsearch не запускается. Сообщения журнала указывают на ошибку ограничения памяти.

Однако, когда я затем все разрываю и снова включаю, сразу запускаются все контейнеры, включая контейнер ELK, и все остается стабильным. Проблема возникает только при первом запуске стека на новом экземпляре EC2.

Из статистики докеров я вижу, что контейнер ELK использует только 2-3 ГБ из 32 ГБ оперативной памяти, доступной на экземпляре.

Контейнер ELK настроен следующим образом:

elk:
  image: sebp/elk
  hostname: elk
  container_name: elk
  volumes:
    - ./pipeline/:/etc/logstash/conf.d/
  tty: true
  expose:
    - "12201/udp"
  network_mode: host
  ports:
    - "5601:5601"
    - "9200:9200"
    - "12201:12201"
  ulimits:
    nofile:
      soft: 65536
      hard: 65536

При запуске между контейнерами нет зависимостей.

Что происходит с elasticsearch при первом запуске, что приводит к сбою контейнера при запуске?

Проблема заключалась в том, что изображение sebp / elb содержит параметр тайм-аута, срок действия которого истекал до того, как можно было запустить elasticsearch.

Управляется переменной среды ES_CONNECT_RETRY, для которой по умолчанию установлено значение 30 секунд. Для запуска Elasticsearch в первый раз требуется больше времени, поэтому, когда я установил значение 300 секунд, это сработало. Вы можете добавить это как переменную среды для контейнера elk в свой манифест docker-compose.

elk:
  image: sebp/elk
  hostname: elk
  container_name: elk
  environment:
   - ES_CONNECT_RETRY=300

В дополнение к этому вам также необходимо установить переменную среды COMPOSE_HTTP_TIMEOUT перед запуском docker-compose, иначе docker-compose будет тайм-аут до того, как может запуститься elasticsearch. Вы должны установить значение больше, чем вы установили для ES_CONNECT_RETRY, например

COMPOSE_HTTP_TIMEOUT=360

Возможно, это происходит из-за того, что я использую более крупный экземпляр Ec2 (32 ГБ ОЗУ). Для небольших экземпляров это может не быть проблемой.