webentwicklung-frage-antwort-db.com.de

Kafka-Setup mit Docker-Compose

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.

4
Erik Vullings

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.

0
Fritz Duchardt