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

容器内无法通过容器主机名访问服务:Kafka集群启动失败

解决Docker Compose部署Confluent Kafka时Broker无法连接ZooKeeper的问题

问题背景

  • 环境:Ubuntu 18.04.6 LTS虚拟机,Docker Engine 20.10.20
  • 部署方式:采用默认bridge网络(kafka_default)的docker-compose配置,包含zookeeper、broker服务
  • 故障现象:执行sudo docker-compose up -d后仅zookeeper容器正常运行,broker容器以状态1退出,日志显示无法连接zookeeper:2181,报错Connection refused
  • 排查细节:
    • ZooKeeper容器内ping自身主机名正常,telnet localhost 2181连接成功,但telnet zookeeper 2181失败
    • 宿主机telnet localhost 2181正常,nmap扫描显示2181端口为filtered状态

原因分析

  1. ZooKeeper绑定地址限制:ZooKeeper默认仅绑定localhost(127.0.0.1),导致容器内通过服务名解析到的容器IP无法访问2181端口,仅能在容器内部通过localhost访问
  2. 防火墙规则拦截:宿主机UFW或iptables规则过滤了容器间网络流量,导致2181端口被标记为filtered
  3. 默认bridge网络异常:默认bridge网络的DNS解析或端口转发存在问题,服务名无法正确映射到容器IP并建立连接

解决方案

方案1:调整ZooKeeper配置,监听所有地址

修改docker-compose.yml中zookeeper服务的环境变量,让ZooKeeper绑定所有可用IP:

services:
  zookeeper:
    image: confluentinc/cp-zookeeper:latest
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000
      ZOOKEEPER_LISTEN_ALLIPS: "true"
    ports:
      - "2181:2181"

该配置确保ZooKeeper监听容器所有网络接口,通过容器IP或服务名均可访问2181端口。

方案2:调整宿主机防火墙规则

  1. 临时关闭UFW验证是否为防火墙问题:
sudo ufw disable

重启容器:

sudo docker-compose down && sudo docker-compose up -d

若问题解决,添加允许Docker网络的UFW规则后重新启用:

sudo ufw allow in on docker0
sudo ufw allow out on docker0
sudo ufw enable
  1. 检查iptables规则,确保DOCKER-USER链未拦截流量:
sudo iptables -L DOCKER-USER -n

如有拒绝规则,调整或移除即可。

方案3:重建默认bridge网络

若默认bridge网络配置异常,删除后重建:

sudo docker-compose down
sudo docker network rm bridge
# Docker会自动重建默认bridge网络
sudo docker network ls
sudo docker-compose up -d

方案4:使用自定义bridge网络

自定义bridge网络在DNS解析和网络稳定性上更优,修改docker-compose.yml添加自定义网络:

networks:
  kafka-net:
    driver: bridge

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

  broker:
    image: confluentinc/cp-kafka:latest
    depends_on:
      - zookeeper
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker: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
    networks:
      - kafka-net
    ports:
      - "9093:9093"

验证步骤

修改配置后执行以下操作验证:

  1. 进入zookeeper容器,执行telnet zookeeper 2181,确认连接成功
  2. 启动broker容器,查看日志:sudo docker-compose logs broker,确认无连接拒绝报错
  3. 宿主机执行nmap localhost -p 2181,确认端口状态为open

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 02:35:26