web-dev-qa-db-fra.com

Configuration Kafka avec docker-compose

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.

4
Erik Vullings

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.

0
Fritz Duchardt