容器内无法通过容器主机名访问服务: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状态
- ZooKeeper容器内ping自身主机名正常,
原因分析
- ZooKeeper绑定地址限制:ZooKeeper默认仅绑定
localhost(127.0.0.1),导致容器内通过服务名解析到的容器IP无法访问2181端口,仅能在容器内部通过localhost访问 - 防火墙规则拦截:宿主机UFW或iptables规则过滤了容器间网络流量,导致2181端口被标记为filtered
- 默认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:调整宿主机防火墙规则
- 临时关闭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
- 检查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"
验证步骤
修改配置后执行以下操作验证:
- 进入zookeeper容器,执行
telnet zookeeper 2181,确认连接成功 - 启动broker容器,查看日志:
sudo docker-compose logs broker,确认无连接拒绝报错 - 宿主机执行
nmap localhost -p 2181,确认端口状态为open
内容的提问来源于stack exchange,提问作者sayak_ghosh90
相关产品推荐
相关产品推荐

