фон
Недавно я изучаю знания, связанные с Kafka, и мне нужно создать собственную среду Kafka. После всестороннего рассмотрения я решил использовать docker-compose для управления и обслуживания этой среды.
docker-compose.yml
YML-файл Bitnami очень хорош и используется непосредственно здесь.
version: "2"
services:
zookeeper:
image: docker.io/bitnami/zookeeper:3.8
ports:
- "2181:2181"
volumes:
- "zookeeper_data:/bitnami"
environment:
- ALLOW_ANONYMOUS_LOGIN=yes
kafka:
image: docker.io/bitnami/kafka:3.4
ports:
- "9092:9092"
volumes:
- "kafka_data:/bitnami"
environment:
- KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
- ALLOW_PLAINTEXT_LISTENER=yes
depends_on:
- zookeeper
volumes:
zookeeper_data:
driver: local
kafka_data:
driver: local
Первый опыт работы с docker-compose
После загрузки или создания вышеуказанного файла yml запустите:
$ ls
docker-compose.yml
$ docker-compose up -d
Creating network "kafka_default" with the default driver
Pulling kafka (docker.io/bitnami/kafka:3.4)...
3.4: Pulling from bitnami/kafka
55154658374f: Pull complete
Digest: sha256:659549c08f8a1cfce344d31b608ec2d039a66a9b610423c4bc390c486a8cebbd
Status: Downloaded newer image for bitnami/kafka:3.4
Creating kafka_zookeeper_1 ... done
Creating kafka_kafka_1 ... done
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4fe1da00ef96 bitnami/kafka:3.4 "/opt/bitnami/script…" 2 minutes ago Up 2 minutes 0.0.0.0:9092->9092/tcp kafka_kafka_1
bc018108f95e bitnami/zookeeper:3.8 "/opt/bitnami/script…" 2 minutes ago Up 2 minutes 2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp, 8080/tcp kafka_zookeeper_1
После запуска службы вы можете войти в контейнер для доступа к службе Kafka.
$ docker exec -it 4fe1 /bin/bash
Разрешить внешний доступ
Мы используем наш Java-клиент для подключения к службе Kafka в указанном выше контейнере докеров, но результат продолжает сообщать об ошибках.
Error connecting to node 4fe1da00ef96:9092 (id: 1001 rack: null)
java.net.UnknownHostException: 4fe1da00ef96: nodename nor servname provided, or not known
Это связано с тем, что по умолчанию служба kafka разрешает только локальные подключения.
Обновите docker-compose.yml, чтобы открыть внешний доступ.
- Добавьте переменные среды
environment:
- KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
- ALLOW_PLAINTEXT_LISTENER=yes
+ - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CLIENT:PLAINTEXT,EXTERNAL:PLAINTEXT
+ - KAFKA_CFG_LISTENERS=CLIENT://:9092,EXTERNAL://:9093
+ - KAFKA_CFG_ADVERTISED_LISTENERS=CLIENT://kafka:9092,EXTERNAL://localhost:9093
+ - KAFKA_CFG_INTER_BROKER_LISTENER_NAME=CLIENT
- открытый порт
ports:
- - '9092:9092'
+ - '9093:9093'
Остановка и удаление контейнеров и перезапуск новых.
$ docker-compose down
Stopping kafka_kafka_1 ... done
Stopping kafka_zookeeper_1 ... done
Removing kafka_kafka_1 ... done
Removing kafka_zookeeper_1 ... done
Removing network kafka_default
$ docker-compose up -d
Creating network "kafka_default" with the default driver
Creating kafka_zookeeper_1 ... done
Creating kafka_kafka_1 ... done
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
13ba5ed71886 bitnami/kafka:3.4 "/opt/bitnami/script…" 24 seconds ago Up 22 seconds 0.0.0.0:9092-9093->9092-9093/tcp kafka_kafka_1
e4ca7940e7ab bitnami/zookeeper:3.8 "/opt/bitnami/script…" 25 seconds ago Up 24 seconds 2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp, 8080/tcp kafka_zookeeper_1
Обновить хосты
Просмотрите информацию об IP-адресе хоста и сопоставьте имя службы Kafka, управляемое с помощью docker-compose, с текущим IP-адресом хоста.
$ ifconfig | grep 192
inet 192.168.10.241 netmask 0xffffff00 broadcast 192.168.10.255
$ cat /etc/hosts
# docker
192.168.10.241 kafka
На этом этапе мы можем подключиться к сервису Kafka в Java-коде.
properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "127.0.0.1:9092");
properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "127.0.0.1:9093");
properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "192.168.10.241:9092");
properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "192.168.10.241:9093");
Тест показал, что все эти методы можно соединить. Почему это? Добро пожаловать, чтобы оставить сообщение и поделиться.
Другой способ настройки параметров:
- KAFKA_CFG_LISTENERS=PLAINTEXT://0.0.0.0:9092
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://192.168.77.159:9092