Я развертываю стек из 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 ГБ ОЗУ). Для небольших экземпляров это может не быть проблемой.