You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker部署Kafka与Debezium时kafka:9092解析失败问题求助

问题:Docker Compose部署中Debezium无法解析kafka:9092主机名

我通过Docker Compose部署Kafka、Debezium、PostgreSQL、PgAdmin及ZooKeeper服务,Debezium的BOOTSTRAP_SERVERS配置为kafka:9092,但运行时出现错误:

'Failed to resolve 'kafka:9092': nodename nor servname provided, or not known'

当前所有Docker容器状态看似正常,请问为何会出现该错误?

我的Docker Compose配置如下:

version: "3.4"
services:
  postgres:
    container_name: postgres
    image: postgres
    environment:
      POSTGRES_USER: ${POSTGRES_USER:-fatih}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-admin}
      PGDATA: /data/postgres
    command:
      - "postgres"
      - "-c"
      - "wal_level=logical"
    volumes:
      - ./postgres-data:/var/lib/postgresql/data
    ports:
      - "5431:5432"
    restart: unless-stopped
    
  pgadmin:
    container_name: pgadmin
    image: dpage/pgadmin4
    environment:
      PGADMIN_DEFAULT_EMAIL: ${PGADMIN_DEFAULT_EMAIL:-fatih@fatih.org}
      PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_DEFAULT_PASSWORD:-admin}
      PGADMIN_CONFIG_SERVER_MODE: 'False'
    ports:
      - "${PGADMIN_PORT:-5050}:80"
    depends_on:
      - postgres
      
  zookeeper:
    image: confluentinc/cp-zookeeper
    restart: always
    ports:
      - "2181:2181"
    volumes:
      - "zookeeper_data:/confluent"
    environment:
      - ALLOW_ANONYMOUS_LOGIN=yes
      - ZOOKEEPER_CLIENT_PORT=2181
  kafka:
    container_name: kafka
    image: confluentinc/cp-kafka:latest
    ports:
      - "9092:9092"
    restart: always
    volumes:
      - "kafka_data:/confluent"
    environment:
      - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
      - ALLOW_PLAINTEXT_LISTENER=yes
      - KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1
      - KAFKA_LOG_CLEANER_DELETE_RETENTION_MS=5000
      - KAFKA_BROKER_ID=1
      - KAFKA_MIN_INSYNC_REPLICAS=1
      - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092
    depends_on:
      - zookeeper
      - postgres
  connector:
    image: debezium/connect:latest
    ports:
      - "8083:8083"
    environment:
      - BOOTSTRAP_SERVERS=kafka:9092
      - GROUP_ID=1
      - CONFIG_STORAGE_TOPIC=my_connect_configs
      - OFFSET_STORAGE_TOPIC=my_connect_offsets
      - STATUS_STORAGE_TOPIC=my_connect_statuses
    depends_on:
      - zookeeper
      - kafka

volumes:
  zookeeper_data:
    driver: local
  kafka_data:
    driver: local

原因分析及解决方案

核心原因:服务启动顺序与就绪状态不匹配

Docker Compose的depends_on仅能确保依赖容器启动,无法保证容器内的服务完全就绪。当Debezium容器启动时,Kafka容器虽然已经运行,但Kafka服务可能还在初始化(比如连接ZooKeeper、创建内部主题等),此时Debezium尝试连接Kafka会失败,错误信息可能被误导为“主机名无法解析”,但实际是Kafka服务未就绪。

此外,你的Kafka配置缺少KAFKA_LISTENERS参数,可能导致Kafka未正确监听端口,进一步加剧连接问题。

解决方案

1. 完善Kafka配置,添加监听参数

在Kafka服务的environment中添加KAFKA_LISTENERS,确保Kafka监听容器内的所有网络接口:

kafka:
  # ... 其他配置不变
  environment:
    # ... 原有参数
    - KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092
    - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092

2. 添加健康检查,确保Kafka就绪后启动Debezium

给Kafka服务添加健康检查,让Debezium仅在Kafka服务完全就绪后再启动:

kafka:
  # ... 其他配置不变
  healthcheck:
    test: ["CMD", "kafka-topics", "--list", "--bootstrap-server", "localhost:9092"]
    interval: 10s
    timeout: 5s
    retries: 5
    start_period: 20s  # 给Kafka留出初始化时间

然后修改Debezium(connector)服务的depends_on,使用健康检查条件:

connector:
  # ... 其他配置不变
  depends_on:
    zookeeper:
      condition: service_started
    kafka:
      condition: service_healthy

3. 验证Docker网络(可选)

确认所有服务都在同一个Docker网络中:

  • 执行docker network ls查看当前网络列表,找到与你的Compose项目同名的网络(默认以项目目录命名)
  • 执行docker inspect <网络名称>,检查所有服务容器是否在该网络的Containers列表中

如果存在网络异常,可以手动指定自定义网络:

# 在Compose文件末尾添加
networks:
  kafka-network:
    driver: bridge

# 给每个服务添加networks字段,比如:
postgres:
  # ... 其他配置
  networks:
    - kafka-network

pgadmin:
  # ... 其他配置
  networks:
    - kafka-network

zookeeper:
  # ... 其他配置
  networks:
    - kafka-network

kafka:
  # ... 其他配置
  networks:
    - kafka-network

connector:
  # ... 其他配置
  networks:
    - kafka-network

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 08:52:54