У вас включен AdBlock или иной блокировщик рекламы.

Пожалуйста, отключите его, доход от рекламы помогает развитию сайта и появлению новых статей.

Спасибо за понимание.

В другой раз
DevGang блог о програмировании
Авторизоваться

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
#Doker