Bonjour, je prépare actuellement Kafka avec Docker. J'ai réussi à configurer Zookeeper et Kafka avec l'image de confluent publiée, voir le fichier docker-compose suivant:
version: '2'
services:
zookeeper:
image: confluentinc/cp-zookeeper:3.2.0
container_name: zookeeper
hostname: zookeeper
ports:
- "2181:2181"
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
restart: always
kafka:
image: confluentinc/cp-kafka:3.2.0
hostname: kafka
container_name: kafka
depends_on:
- zookeeper
ports:
- '9092:9092'
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.99.100:9092
LISTENERS: PLAINTEXT://0.0.0.0:9092
restart: always
kafka-rest:
image: confluentinc/cp-kafka-rest:3.2.0
container_name: kafka-rest
depends_on:
- kafka
ports:
- '8082:8082'
environment:
KAFKA_REST_ZOOKEEPER_CONNECT: 'zookeeper:2181'
KAFKA_REST_LISTENERS: http://kafka-rest:8082
KAFKA_REST_SCHEMA_REGISTRY_URL: http://schema-registry:8081
KAFKA_REST_Host_NAME: kafka-rest
restart: always
schema-registry:
image: confluentinc/cp-schema-registry:3.2.0
container_name: schema-registry
depends_on:
- kafka
ports:
- '8081'
environment:
SCHEMA_REGISTRY_KAFKASTORE_CONNECTION_URL: 'zookeeper:2181'
SCHEMA_REGISTRY_Host_NAME: schema-registry
SCHEMA_REGISTRY_LISTENERS: http://schema-registry:8081
restart: always
connect:
image: confluentinc/cp-kafka-connect:3.2.0
container_name: kafka-connect
depends_on:
- zookeeper
- kafka
- schema-registry
ports:
- "8083:8083"
restart: always
environment:
CONNECT_BOOTSTRAP_SERVERS: 'kafka:9092'
CONNECT_REST_ADVERTISED_Host_NAME: connect
CONNECT_REST_PORT: 8083
CONNECT_GROUP_ID: compose-connect-group
CONNECT_CONFIG_STORAGE_TOPIC: docker-connect-configs
CONNECT_OFFSET_STORAGE_TOPIC: docker-connect-offsets
CONNECT_STATUS_STORAGE_TOPIC: docker-connect-status
CONNECT_KEY_CONVERTER: io.confluent.connect.avro.AvroConverter
CONNECT_KEY_CONVERTER_SCHEMA_REGISTRY_URL: http://schema-registry:8081
CONNECT_VALUE_CONVERTER: io.confluent.connect.avro.AvroConverter
CONNECT_VALUE_CONVERTER_SCHEMA_REGISTRY_URL: http://schema-registry:8081
CONNECT_INTERNAL_KEY_CONVERTER: org.Apache.kafka.connect.json.JsonConverter
CONNECT_INTERNAL_VALUE_CONVERTER: org.Apache.kafka.connect.json.JsonConverter
CONNECT_ZOOKEEPER_CONNECT: "zookeeper:2181"
Maintenant, j'ai réussi à exposer correctement le conteneur Kafka à mes applications non dockérisées en définissant correctement la propriété advertised.listener sur PLAINTEXT: // {DOCKER_MACHINE_IP}: 9092, mais comme vous pouvez le voir, j'ai également ajouté d'autres applications confluent à étendre ma configuration Kafka (Kafka REST, Schema-Registry). Ceux-ci ne peuvent plus se connecter à mon instance Kafka à cause de la propriété advertised.listener.
Je pouvais le changer pour le nom d'hôte de conteneur correct -> PLAINTEXT: // kafka: 9092, mais je perds ensuite la possibilité d'atteindre l'instance de kafka à nouveau avec mes autres applications. Existe-t-il un moyen simple de résoudre ce problème?
Omar, vous avez peut-être déjà résolu votre problème, mais pour des raisons futures, le commentaire de Hans Jespersen m'a fait l'affaire, même sous Windows.
En tant qu'administrateur, ouvrez C:\Windows\System32\drivers\etc\hosts
et ajoutez la ligne suivante pour exposer le courtier kafka en tant qu'hôte local .
127.0.0.1 broker
Et mon fichierdocker-compose.yml
se présente comme suit:
---
version: '2'
services:
zookeeper:
image: confluentinc/cp-zookeeper
hostname: zookeeper
extra_hosts:
- "moby:127.0.0.1"
ports:
- "2181:2181"
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
broker:
image: confluentinc/cp-kafka
hostname: broker
extra_hosts:
- "moby:127.0.0.1"
depends_on:
- zookeeper
ports:
- '9092:9092'
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
KAFKA_ADVERTISED_LISTENERS: 'PLAINTEXT://broker:9092'
KAFKA_DEFAULT_REPLICATION_FACTOR: 1
schema_registry:
image: confluentinc/cp-schema-registry
hostname: schema_registry
# extra_hosts:
# - "moby:127.0.0.1"
depends_on:
- zookeeper
- broker
ports:
- '8081:8081'
environment:
SCHEMA_REGISTRY_Host_NAME: schema_registry
SCHEMA_REGISTRY_KAFKASTORE_CONNECTION_URL: 'zookeeper:2181'
kafka-rest:
image: confluentinc/cp-kafka-rest
container_name: kafka-rest
extra_hosts:
- "moby:127.0.0.1"
depends_on:
- zookeeper
- broker
ports:
- '8082:8082'
environment:
KAFKA_REST_ZOOKEEPER_CONNECT: 'zookeeper:2181'
KAFKA_REST_LISTENERS: http://kafka-rest:8082
KAFKA_REST_SCHEMA_REGISTRY_URL: http://schema-registry:8081
KAFKA_REST_Host_NAME: kafka-rest
Ou encore, exposer l'adresse IP actuelle de mon ordinateur portable (avec ipconfig/all) fonctionne aussi, mais cela présente l'inconvénient de devoir modifier le fichier docker-compose.yml
chaque fois que mon réseau change.
En supposant qu'il s'agisse d'une configuration destinée à votre environnement de développement local, j'exécuterais tous les conteneurs sur votre réseau d'hôtes plutôt que sur un réseau Docker.
Cela peut être fait en ajoutant network_mode: Host
à vos configurations de conteneur. L'ajout de mappages de ports ou de noms d'hôte est obsolète.
version: '2'
services:
zookeeper:
image: confluentinc/cp-zookeeper:3.2.0
network_mode: Host
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
restart: always
kafka:
image: confluentinc/cp-kafka:3.2.0
depends_on:
- zookeeper
network_mode: Host
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: 'localhost:2181'
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092
LISTENERS: PLAINTEXT://localhost:9092
restart: always
kafka-rest:
image: confluentinc/cp-kafka-rest:3.2.0
depends_on:
- kafka
network_mode: Host
environment:
KAFKA_REST_ZOOKEEPER_CONNECT: 'localhost:2181'
KAFKA_REST_LISTENERS: http://localhost:8082
KAFKA_REST_SCHEMA_REGISTRY_URL: http://localhost:8081
KAFKA_REST_Host_NAME: localhost
restart: always
schema-registry:
image: confluentinc/cp-schema-registry:3.2.0
depends_on:
- kafka
network_mode: Host
environment:
SCHEMA_REGISTRY_KAFKASTORE_CONNECTION_URL: 'localhost:2181'
SCHEMA_REGISTRY_Host_NAME: localhost
SCHEMA_REGISTRY_LISTENERS: http://localhost:8081
restart: always
connect:
image: confluentinc/cp-kafka-connect:3.2.0
depends_on:
- zookeeper
- kafka
- schema-registry
network_mode: Host
restart: always
environment:
CONNECT_BOOTSTRAP_SERVERS: 'localhost:9092'
CONNECT_REST_ADVERTISED_Host_NAME: connect
CONNECT_REST_PORT: 8083
CONNECT_GROUP_ID: compose-connect-group
CONNECT_CONFIG_STORAGE_TOPIC: docker-connect-configs
CONNECT_OFFSET_STORAGE_TOPIC: docker-connect-offsets
CONNECT_STATUS_STORAGE_TOPIC: docker-connect-status
CONNECT_KEY_CONVERTER: io.confluent.connect.avro.AvroConverter
CONNECT_KEY_CONVERTER_SCHEMA_REGISTRY_URL: http://localhost:8081
CONNECT_VALUE_CONVERTER: io.confluent.connect.avro.AvroConverter
CONNECT_VALUE_CONVERTER_SCHEMA_REGISTRY_URL: http://localhost:8081
CONNECT_INTERNAL_KEY_CONVERTER: org.Apache.kafka.connect.json.JsonConverter
CONNECT_INTERNAL_VALUE_CONVERTER: org.Apache.kafka.connect.json.JsonConverter
CONNECT_ZOOKEEPER_CONNECT: "localhost:2181"
Avertissement pour Mac : Étant donné que Docker sur Mac s'exécute sur une machine virtuelle, cette fonctionnalité n'est pas prise en charge. Autant que je sache, les utilisateurs de mac n'ont pas d'autre choix que d'utiliser des mappages de ports et d'éditer leur /etc/hosts
.
Avertissement pour Windows : probablement le même problème - après tout, Docker ne fonctionne que de manière native sur les noyaux Linux.