Hallo, ich bin gerade dabei, Kafka mit Docker einzurichten. Ich habe es geschafft, Zookeeper und Kafka mit dem veröffentlichten Bild zusammenzubauen, siehe folgende Docker-Compose-Datei:
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"
Jetzt habe ich es geschafft, den Kafka-Container für meine nicht angedockten Anwendungen korrekt bereitzustellen, indem Sie die Eigenschaft adverted.listener korrekt auf PLAINTEXT: // {DOCKER_MACHINE_IP}: 9092 setzen, aber wie Sie sehen, habe ich auch andere Anwendungen hinzugefügt mein Kafka-Setup erweitern (Kafka REST, Schema-Registry). Diese können aufgrund der Eigenschaft adverted.listener keine Verbindung mehr zu meiner Kafka-Instanz herstellen.
Ich könnte es in den richtigen Container-Hostnamen ändern -> PLAINTEXT: // kafka: 9092, aber dann verliere ich die Fähigkeit, die kafka-Instanz mit meinen anderen Apps erneut zu erreichen. Gibt es eine einfache Möglichkeit, dieses Problem zu lösen?
Omar, vielleicht haben Sie Ihr Problem bereits gelöst, aber als Hinweis darauf hat Hans Jespersens Kommentar den Trick für mich selbst unter Windows ausgeführt.
Öffnen Sie als Administrator C:\Windows\System32\drivers\etc\hosts
und fügen Sie die folgende Zeile hinzu, um den Kafka-Broker als localhost anzuzeigen .
127.0.0.1 broker
Und meinedocker-compose.yml
-Datei sieht folgendermaßen aus:
---
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
Alternativ kann auch die aktuelle IP-Adresse meines Laptops (mit ipconfig/all) verfügbar gemacht werden. Dies hat jedoch den Nachteil, dass ich bei Änderungen meines Netzwerks auch die docker-compose.yml
-Datei ändern muss.
Angenommen, dies ist ein für Ihre lokale Entwicklungsumgebung vorgesehenes Setup, ich würde alle Container in Ihrem Host-Netzwerk ausführen und nicht in einem Docker-Netzwerk.
Dies kann durch Hinzufügen von network_mode: Host
zu Ihren Containerkonfigurationen erfolgen. Das Hinzufügen von Port-Mappings oder Host-Namen ist obsolet.
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"
Warnung für Mac : Da Docker unter Mac in einer virtuellen Maschine ausgeführt wird, wird diese Funktion nicht unterstützt. Soweit ich weiß, haben Mac-Benutzer keine andere Wahl, als Port-Mappings zu verwenden und ihren /etc/hosts
zu bearbeiten.
Warnung für Windows : wahrscheinlich dasselbe Problem - nachdem alle Docker nur nativ auf Linux-Kernels ausgeführt werden.