You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Docker Compose中使用confluent/cp-kafka镜像实现本地与容器网络访问

解决Confluent Kafka Docker Compose本地与容器网络双连接问题

嘿,我来帮你搞定这两个Confluent Kafka的Docker Compose配置问题!毕竟现在官方的cp-kafka镜像已经弃用了旧的KAFKA_ADVERTISED_HOST_NAME这类参数,得用他们现在推荐的监听/通告机制来实现本地和容器网络同时连接~


问题1:配置localhost通告与容器网络名称kafka

要让Kafka同时支持容器内部通过服务名kafka访问,以及本地通过localhost访问,核心是正确配置监听地址通告地址,这也是Confluent现在官方推荐的方式。

下面是完整的Docker Compose配置示例:

version: '3.8'

# 自定义网络,让容器之间可以通过服务名通信
networks:
  kafka-net:
    name: kafka-net

services:
  zookeeper:
    image: confluentinc/cp-zookeeper:latest
    networks:
      - kafka-net
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000

  kafka:
    image: confluentinc/cp-kafka:latest
    networks:
      - kafka-net
    depends_on:
      - zookeeper
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      # 定义Kafka监听的端口:内部容器用9092,本地用9093
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,PLAINTEXT_HOST://0.0.0.0:9093
      # 通告地址:告诉客户端怎么连接——容器内用kafka:9092,本地用localhost:9093
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:9093
      # 映射监听协议,这里都是明文PLAINTEXT
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      # 指定Broker之间内部通信用PLAINTEXT(也就是kafka:9092)
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      # 测试环境下偏移量主题副本数设为1即可
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1

关键参数解释:

  • KAFKA_LISTENERS:让Kafka监听所有网卡的两个端口,9092给容器内部网络用,9093给本地localhost用
  • KAFKA_ADVERTISED_LISTENERS:这是核心!它会把正确的连接地址返回给客户端——容器内的服务(比如你的业务容器)会拿到kafka:9092,本地客户端会拿到localhost:9093
  • 自定义网络kafka-net:确保容器之间可以通过服务名kafka直接访问,不需要暴露端口到本地

问题2:暴露端口至localhost与容器网络名称kafka

这个需求其实是在问题1的基础上,把本地访问的端口显式暴露出来(默认自定义网络内部端口是互通的,但本地需要端口映射才能访问)。配置上只需要在Kafka服务里添加ports字段即可:

version: '3.8'

networks:
  kafka-net:
    name: kafka-net

services:
  zookeeper:
    image: confluentinc/cp-zookeeper:latest
    networks:
      - kafka-net
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000

  kafka:
    image: confluentinc/cp-kafka:latest
    networks:
      - kafka-net
    depends_on:
      - zookeeper
    # 把容器的9093端口映射到本地的9093端口,实现本地访问
    ports:
      - "9093:9093"
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,PLAINTEXT_HOST://0.0.0.0:9093
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:9093
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1

关键说明:

  • ports: - "9093:9093":这一步把容器的9093端口映射到本地的9093端口,这样本地客户端(比如你的本地代码、kafka-console-producer.sh)就能通过localhost:9093连接Kafka
  • 容器内部的服务依然通过kafka:9092访问,不需要暴露这个端口,因为自定义网络内部的容器可以直接访问服务的端口
  • 如果想修改本地访问的端口,比如改成9094,只需要把ports改成"9094:9093",同时把KAFKA_ADVERTISED_LISTENERS里的PLAINTEXT_HOST://localhost:9093改成PLAINTEXT_HOST://localhost:9094就行

额外注意事项:

  • 绝对不要使用旧的KAFKA_ADVERTISED_HOST_NAMEKAFKA_ADVERTISED_PORT参数,这些确实已经被Confluent官方弃用,现在的标准配置就是用KAFKA_LISTENERSKAFKA_ADVERTISED_LISTENERS
  • 生产环境建议调整KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR为3(至少2),确保高可用,测试环境用1没问题
  • 如果启动后本地连不上,先检查防火墙是否放行9093端口,或者Docker的端口映射是否正常

内容的提问来源于stack exchange,提问作者jemiloii

火山引擎 最新活动