繁体   English   中英

docker kafka 代理无法从外部或其他 docker 容器访问

[英]docker kafka broker is not accessible from outside or other docker container

我在 docker 容器中运行 kafka 代理,在单独的容器中运行 zookeeper。

我试图从当地联系动物园管理员,它工作正常。

我试图从本地联系经纪人,它抛出以下错误并最终失败。

[Timestamp] WARN [Producer clientId=console-producer] Error while fetching metadata with correlation id 65 : {tmpc=INVALID_REPLICATION_FACTOR} (org.apache.kafka.clients.NetworkClient)
[Timestamp] WARN [Producer clientId=console-producer] Error while fetching metadata with correlation id 66 : {tmpc=INVALID_REPLICATION_FACTOR} (org.apache.kafka.clients.NetworkClient)

我使用了端口(-p 和 --link),还尝试了使用单独的网络。 在这两种情况下我都可以访问 zookeeper,但我无法访问代理。

我有一个基本映像,其中仅解压缩了 kafka 并安装了 java。 它在 ubuntu 中运行

动物园管理员的 Docker 图像:

FROM IMAGE
COPY ./zookeeper_setup.sh  zookeeper_setup.sh
ENTRYPOINT ["sh","zookeeper_setup.sh"]

Zookeeper setup: # Just changing the log dir so I can mount it to a location and using the same 2181 port by default

sed -i "s%dataDir=/tmp/zookeeper%dataDir=${LOGDIR}%g" ./config/zookeeper.properties
sh ./bin/zookeeper-server-start.sh ./config/zookeeper.properties 

卡夫卡图片:

FROM IMAGE [SAME base image]
COPY ./broker_setup.sh  broker_setup.sh
ENTRYPOINT ["sh","broker_setup.sh"]

Broker setup # just setting up the internal and external listeners, ports and zookeeper:

sed -i "s#log.dirs=/tmp/kafka-logs#log.dirs=${LOGDIR}#g" ./config/server.properties
sed -i "s#broker.id=0#broker.id=${BROKERID}#g" ./config/server.properties
sed -i "s@#listeners=PLAINTEXT://:9092@listeners=INTERNAL://:2${KAFKAPORT},EXTERNAL://:${KAFKAPORT}@g" ./config/server.properties
sed -i "s/zookeeper.connect=localhost:2181/zookeeper.connect=${ZOOKEEPERCONNECT}/g" ./config/server.properties
echo -e "\nlistener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT" >> ./config/server.properties
echo -e "\ninter.broker.listener.name=INTERNAL" >> ./config/server.properties
sed -i "s~#advertised.listeners=PLAINTEXT://your.host.name:9092~advertised.listeners=INTERNAL://localhost:2${KAFKAPORT},EXTERNAL://localhost:${KAFKAPORT}~g" ./config/server.properties
sh ./bin/kafka-server-start.sh ./config/server.properties

我通过参考此页面设置了代理以将端口公开给外界。 https://rmoff.net/2018/08/02/kafka-listeners-explained/

但是当我启动容器时:

docker run -d -e LOGDIR=/kafka/logs/zookeeper/ -p 2281:2181 -v [OutsideDir]:/kafka/logs/zookeeper/ --name zookeeper-client -t Image

docker run -d --link zookeeper-client:zookeeper --name broker0 -e LOGDIR=/kafka/logs/kafka-logs-1/ -e BROKERID=0 -e KAFKAPORT=9093 -e ZOOKEEPERCONNECT=zookeeper:2181 -e ALLOW_PLAINTEXT_LISTENER=yes -p 8093:9093 -p 28093:29093 -v [LogDir_2]:/kafka/logs/kafka-logs-1/ -t Image

使用二进制文件,我可以创建从本地和另一个容器内部联系 zookeeper 的主题。 但我无法连接到代理以生成任何消息。

我使用隔离的 docker 网络进行了尝试。

docker network create app-network

docker run -d --network app-network --network-alias app-net-zoo -e LOGDIR=/kafka/logs/zookeeper/ -p 2281:2181 -v [logDir]:/kafka/logs/zookeeper/ --name zookeeper-client -t image


docker run --network app-network --network-alias app-net-broker --name broker0 -e LOGDIR=/kafka/logs/kafka-logs-1/ -e BROKERID=0 -e KAFKAPORT=9093 -e ZOOKEEPERCONNECT=app-net-zoo:2181 -e ALLOW_PLAINTEXT_LISTENER=yes -p 8093:9093 -p 28093:29093 -v [logDir_2]:/kafka/logs/kafka-logs-1/ -t image

docker run --network app-network --network-alias app-net-it -it Image_BASE

尝试使用基本图像容器与代理连接

kafka-console-producer.sh --broker-list app-net-broker:9093 --topic tempC [没用]

kafka-topics.sh --create --topic Name_T --zookeeper app-net-zoo:9093 [工作正常]

杀死经纪人和动物园管理员,清除日志,然后我单独创建了一个动物园管理员容器,然后将基础镜像作为容器启动。 在那个交互式容器中,我创建了一个代理并尝试连接到该代理,它工作正常。 现在我可以清楚地看到这是一个纯粹的网络问题。 你们能帮我解决这个问题吗?

您有两个广告侦听器,它们都是 localhost。 因此,在 Docker 网络中运行的任何客户端都不会工作,只有在同一主机上使用端口转发运行的客户端才能在引导后访问代理。

您的端口转发不起作用的原因是因为您设置-e KAFKAPORT=9093 ,但是您已将主机上的端口 8083 转发到容器中的 9093 ,同时 Kafka 将在引导后返回 9093 以供将来连接,因为那是正在宣传什么。 这在您链接到的博客文章中得到了完美的解释......

请通读Connect to Kafka running in Docker

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM