kafka connection error: Failed to resolve, Connection refused

kafka connection error: Failed to resolve, Connection refused

Zookeeper 和 kafka 运行正在使用

docker compose up -d

---
version: '2'

services:
  zookeeper:
    image: confluentinc/cp-zookeeper:6.1.0
    hostname: zookeeper
    container_name: zookeeper
    ports:
      - "2181:2181"
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000

  broker:
    image: confluentinc/cp-kafka:6.1.0
    hostname: broker
    container_name: broker
    depends_on:
      - zookeeper
    ports:
      - "9092:9092"
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
      KAFKA_ADVERTISED_HOST_NAME: broker
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker:9092
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0

我在本地有一个生产者文件 运行ning p = Producer({'bootstrap.servers': 'localhost:9092'})

消费者将通过 docker

运行宁
FROM python:3.9.5-alpine3.14

RUN apk update \
    && /sbin/apk add --no-cache --virtual .deps gcc musl-dev \
    && /usr/local/bin/pip install --no-cache-dir black==19.10b0 \
    && /sbin/apk del --no-cache .deps \
    && apk add --no-cache git \
    && apk add --update py-pip \
    && apk add postgresql-dev gcc python3-dev musl-dev \
    && apk add linux-headers \
    && apk add --no-cache cargo python3-dev openssl-dev libffi-dev g++ make \
    && apk add --no-cache librdkafka-dev

RUN apk add --no-cache jpeg-dev zlib-dev
RUN apk add --no-cache --virtual .build-deps build-base linux-headers \
    && pip install Pillow
    
COPY /requirements.txt /app/requirements.txt

WORKDIR /app

RUN pip3 install -r requirements.txt

COPY . /app

CMD [ "python3", "consumer.py" ]

consumer.py 有代码:

c = Consumer({
    'bootstrap.servers': 'broker:9092',
    'group.id': 'consumer-group-a',
    'auto.offset.reset': 'earliest'
})

我尽量不编辑主机文件。 Failed to resolve 'broker:9092': Name or service not knownConnection refused。我在尝试 运行 时主要遇到了这两个错误。任何帮助将不胜感激。

谢谢。

您需要将 Python 服务放在同一个组合文件中,这样它就属于可以解析 broker DNS 名称的同一个 Docker 网络。

例如

services:
  app:
    build: 
      context: ./app/  # folder with Dockerfile
    environment:
      BOOTSTRAP_SERVERS: broker:9092  # don't hardcode this in your code

  zookeeper:
     ...
  broker:
     ...

注意:您的消费者可能会在 Kafka 实际 运行 之前尝试连接,因此您应该增加一些睡眠时间。

否则,使用docker network ls,找到托管Kafka和Zookeper的网络,然后使用docker run --network <name> your-python-app