Docker – один из самых популярных контейнерных движков, используемых в индустрии программного обеспечения для создания, упаковки и развертывания приложений.
В этом руководстве узнаем, как настроить Apache Kafka с помощью Docker.
Настройка одного узла (ноды)
Настройка брокера Kafka с одним узлом удовлетворит большинство потребностей локальной разработки, поэтому начнем с изучения этой простой настройки.
Конфигурация docker-compose.yml
Чтобы запустить сервер Apache Kafka, сначала нужно запустить сервер Zookeeper.
Можно настроить эту зависимость в файле docker-compose.yml, что гарантирует, что сервер Zookeeper всегда будет запускаться раньше сервера Kafka и останавливаться после него.
Создадим простой файл docker-compose.yml с двумя сервисами – zookeeper и kafka:
version: '2'
services:
zookeeper:
image: confluentinc/cp-zookeeper:latest
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
ports:
- 22181:2181
kafka:
image: confluentinc/cp-kafka:latest
depends_on:
- zookeeper
ports:
- 29092:29092
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
В этой настройке сервер Zookeeper прослушивает порт 2181 для сервиса kafka, который определен в той же настройке контейнера. Однако для любого клиента, работающего на хосте, он будет доступен через порт 22181.
Аналогичным образом, сервис kafka предоставляется хост-приложениям через порт 29092, но фактически объявляется через порт 9092 в среде контейнера, настроенной свойством KAFKA_ADVERTISED_LISTENERS.
Запуск сервера Kafka
Запустим сервер Kafka, запустив контейнеры с помощью команды docker-compose:
$ docker-compose up -d
Creating network "kafka_default" with the default driver
Creating kafka_zookeeper_1 ... done
Creating kafka_kafka_1 ... done
Теперь воспользуемся командой nc, чтобы убедиться, что оба сервера прослушивают соответствующие порты:
$ nc -z localhost 22181
Connection to localhost port 22181 [tcp/*] succeeded!
$ nc -z localhost 29092
Connection to localhost port 29092 [tcp/*] succeeded!
Кроме того, можно проверить подробные логи во время запуска контейнеров и убедиться, что сервер Kafka работает:
$ docker-compose logs kafka | grep -i started
kafka_1 | [2021-04-10 22:57:40,413] DEBUG [ReplicaStateMachine controllerId=1] Started replica state machine with initial state -> HashMap() (kafka.controller.ZkReplicaStateMachine)
kafka_1 | [2021-04-10 22:57:40,418] DEBUG [PartitionStateMachine controllerId=1] Started partition state machine with initial state -> HashMap() (kafka.controller.ZkPartitionStateMachine)
kafka_1 | [2021-04-10 22:57:40,447] INFO [SocketServer brokerId=1] Started data-plane acceptor and processor(s) for endpoint : ListenerName(PLAINTEXT) (kafka.network.SocketServer)
kafka_1 | [2021-04-10 22:57:40,448] INFO [SocketServer brokerId=1] Started socket server acceptors and processors (kafka.network.SocketServer)
kafka_1 | [2021-04-10 22:57:40,458] INFO [KafkaServer id=1] started (kafka.server.KafkaServer)
После этого Kafka готова к использованию.
Подключение с помощью Kafka Tool
Наконец, воспользуемся утилитой с графическим интерфейсом Kafka Tool, чтобы установить соединение с недавно созданным сервером Kafka, а позже визуализируем эту настройку:

Следует отметить, что нужно использовать свойство Bootstrap servers для подключения к серверу Kafka, прослушивающему порт 29092 для хост-компьютера.
Наконец, можно визуализировать соединение на левой боковой панели:

Таким образом, записи для топиков и потребителей пусты, потому что это новая настройка. После создания топиков можно визуализировать данные по разделам. Более того, если к серверу Kafka подключены активные потребители, можно просмотреть их данные.
Настройка кластера Kafka
Для более стабильного окружения понадобится устойчивая установка. Расширим файл docker-compose.yml, чтобы создать установку кластера Kafka с несколькими узлами.
Конфигурация docker-compose.yml
Настройка кластера для Apache Kafka должна иметь избыточность как для серверов Zookeeper, так и для серверов Kafka.
Поэтому добавим конфигурацию еще по одному узлу для сервисов Zookeeper и Kafka:
---
version: '2'
services:
zookeeper-1:
image: confluentinc/cp-zookeeper:latest
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
ports:
- 22181:2181
zookeeper-2:
image: confluentinc/cp-zookeeper:latest
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
ports:
- 32181:2181
kafka-1:
image: confluentinc/cp-kafka:latest
depends_on:
- zookeeper-1
- zookeeper-2
ports:
- 29092:29092
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:2181,zookeeper-2:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-1:9092,PLAINTEXT_HOST://localhost:29092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
kafka-2:
image: confluentinc/cp-kafka:latest
depends_on:
- zookeeper-1
- zookeeper-2
ports:
- 39092:39092
environment:
KAFKA_BROKER_ID: 2
KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:2181,zookeeper-2:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-2:9092,PLAINTEXT_HOST://localhost:39092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
Необходимо убедиться, что имена сервисов и KAFKA_BROKER_ID уникальны для сервисов.
Кроме того, каждый сервис должен предоставлять хост-компьютеру уникальный порт. Хотя zookeeper-1 и zookeeper-2 прослушивают порт 2181, они предоставляют его хосту через порты 22181 и 32181 соответственно. Та же логика применима к сервисам kafka-1 и kafka-2, где они будут прослушивать порты 29092 и 39092 соответственно.
Запуск кластера Kafka
Запустим кластер с помощью команды docker-compose:
$ docker-compose up -d
Creating network "kafka_default" with the default driver
Creating kafka_zookeeper-1_1 ... done
Creating kafka_zookeeper-2_1 ... done
Creating kafka_kafka-2_1 ... done
Creating kafka_kafka-1_1 ... done
После того, как кластер запущен, воспользуемся Kafka Tool для подключения к кластеру, указав через запятую значения для серверов Kafka и соответствующих портов:

Наконец, взглянем на несколько узлов брокера, доступных в кластере:

Заключение
В этой статье мы использовали технологию Docker для создания одноузловых и многоузловых установок Apache Kafka.
Мы также использовали Kafka Tool для подключения и визуализации сведений о настроенном сервере брокера.