Docker: несколько процессов в одном контейнере
Часто мне нужно несколько процессов в одном контейнере. Например, один экземпляр Kafka для разработки или один экземпляр Elasticsearch - если вы разрабатываете сервисы в архитектуре микросервисов, вы знаете мою проблему! - но для последних версий Kafka или Elasticsearch необходим экземпляр Zookeeper для запуска. Очень неприятно, что вам нужен docker-compose только для тестирования!
В большинстве случаев вам не нужен кластер для тестирования вашей работы, а только один брокер (например), поэтому я создал образ докера, содержащий Zookeeper и Kafka (версия 2.12-2.3.0) вместе, контейнер запускает один экземпляр супервизора http://supervisord.org/, управляющего жизненными процессами.
Я покажу вам, как сделать это шаг за шагом:
Загрузите стабильную версию Kafka с https://kafka.apache.org/, затем:
FROM adoptopenjdk/openjdk11-openj9 COPY start.sh / RUN apt update && apt install -y supervisor && chmod a+x /start.sh ADD kafka_2.12–2.3.0 kafka_2.12–2.3.0 COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf EXPOSE 2181 9092 CMD ["/start.sh"]
- В первой строке я хочу использовать accepttopenjdk в качестве базового образа, потому что он основан на debian (я хочу использовать apt) и на нем уже установлен действительный openjdk
- COPY в start.sh файл в корневом каталоге (подробности ниже)
- apt update необходим для синхронизации менеджера пакетов репозиториев
- Затем установите supervisor и добавьте копию Kafka как есть и скопируйте следующий файл supervisor.conf
Start.sh управляет переменной окружения KAFKA_ADVERTISED_LISTNERS, используемые для настройки Кафка рекламы URL.
#!/bin/bash -e if [[ -z "$KAFKA_ADVERTISED_LISTNERS" ]]; then echo "ERROR: missing mandatory config: KAFKA_ADVERTISED_LISTNERS" exit 1 fi echo "advertised.listeners=PLAINTEXT://$KAFKA_ADVERTISED_LISTNERS:9092" >> /kafka_2.12-2.3.0/config/server.properties exec "/usr/bin/supervisord" "-c" "/etc/supervisor/conf.d/supervisord.conf"
В конце start.sh он запускает демон supervisor со следующей конфигурацией:
[supervisord] nodaemon=true [program:zookeeper] directory=/ user=root command=/kafka_2.12-2.3.0/bin/zookeeper-server-start.sh /kafka_2.12-2.3.0/config/zookeeper.properties stdout_logfile=/dev/fd/1 stdout_logfile_maxbytes=0 redirect_stderr=true [program:kafka] directory=/ user=root command=/kafka_2.12-2.3.0/bin/kafka-server-start.sh /kafka_2.12-2.3.0/config/server.properties stdout_logfile=/dev/fd/1 stdout_logfile_maxbytes=0 redirect_stderr=true starters=5
Супервайзер запускает Zookeeper и одного брокера Kafka: вот и все.
Контейнер теперь работает с действительным экземпляром Zookeeper и Kafka, вы можете связать стандартные порты для взаимодействия с Kafka и Zookeeper.
Билд
docker build -t paspaola/kafka-one-container .
Запуск
docker run -it -p2181:2181 -p9092:9092 -e KAFKA_ADVERTISED_LISTNERS={your-host-address}” paspaola/kafka-one-container