Docker环境下ZooKeeper镜像无法连接sheepkiller/kafka-manager镜像求助
从你贴出的报错信息:
Initiating client connection, connectString=localhost:2181 sessionTimeout=60000 watcher=org.apache.curator.ConnectionState@7bf272d3
[info] o.a.z.ClientCnxn - Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
[warn] o.a.z.ClientCnxn - Session 0x0 for server null, unexpected error, closing socket connection and attempting reconnect
能看出来,你在Windows 10(Docker 17.12.0-ce)上部署sheepkiller/kafka-manager和ZooKeeper时,kafka-manager一直在错误地尝试连接自己容器内部的localhost:2181,而非真正运行ZooKeeper的容器。这是Docker容器网络隔离导致的典型问题,下面给你一步步解决:
问题核心原因
Docker容器默认处于相互隔离的网络环境,你分别启动的ZooKeeper和kafka-manager容器,彼此不在同一个可直接通信的网络组中:kafka-manager容器内的localhost指向的是它自身容器,不是运行ZooKeeper的容器,自然无法建立连接。
具体解决步骤
- 创建一个自定义Docker网络(这种方式能让容器间直接通过容器名称通信,比默认网络更方便):
docker network create kafka-cluster-net - 启动ZooKeeper容器并加入刚创建的自定义网络,同时给容器起个好记的名字(比如
zk-node):docker run --name zk-node --restart always -d --network kafka-cluster-net zookeeper - 启动Kafka-Manager容器,将
ZK_HOSTS设置为ZooKeeper的容器名zk-node:2181,同样加入同一个自定义网络:docker run -it --rm -p 9000:9000 -e ZK_HOSTS="zk-node:2181" -e APPLICATION_SECRET=letmein --network kafka-cluster-net sheepkiller/kafka-manager
额外说明
- 你之前的启动命令没有给两个容器指定共享网络,导致它们无法互通;而且kafka-manager默认使用
localhost:2181,这个地址在它自身容器里根本访问不到ZooKeeper服务 - 完全不需要修改已拉取的镜像,只需要调整启动命令的网络参数和环境变量就能解决问题
- 如果想验证网络连通性,可以进入kafka-manager容器内部,执行
ping zk-node,能ping通就说明网络配置没问题
内容的提问来源于stack exchange,提问作者Mike3355

