Docker部署Kafka与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

