提问人:fuzzi 提问时间:6/7/2019 更新时间:2/3/2023 访问量:11840
我的 kafka docker 容器无法连接到我的 zookeeper docker 容器
My kafka docker container cannot connect to my zookeeper docker container
问:
我想同时使用两者,并在单个 Ubuntu 服务器上运行它们。confluent/kafka
confluent/zookeeper
我正在使用以下配置:
docker run -e ZOOKEEPER_CLIENT_PORT=2181 --name zookeeper confluent/zookeeper
docker run --name kafka -e KAFKA_ADVERTISED_HOST_NAME=kafka -e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 -e KAFKA_CREATE_TOPICS=testtopic:1:1 confluent/kafka
但是,这会导致: 无法连接到 zookeeper:2181
我有其他容器要连接,如何通过 zookeeper:2181 访问 zookeeper 和通过 kafka:9092 访问 kafka ?
答:
Docker 在隔离网络中启动容器,除非显式指定 network,否则调用。default bridge
您可以通过不同的方式取得成功,这里有 2 种最简单的方式:
将容器放入同一个用户定义的桥接网络中
# create net docker network create foo docker run --network=foo -e ZOOKEEPER_CLIENT_PORT=2181 --name zookeeper confluent/zookeeper docker run --network=foo --name kafka -e KAFKA_ADVERTISED_HOST_NAME=kafka -e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 -e KAFKA_CREATE_TOPICS=testtopic:1:1 confluent/kafka
公开端口并通过 localhost 进行连接
docker run -p 2181:2181 -e ZOOKEEPER_CLIENT_PORT=2181 --name zookeeper confluent/zookeeper docker run --name kafka -e KAFKA_ADVERTISED_HOST_NAME=kafka -e KAFKA_ZOOKEEPER_CONNECT=host.docker.internal:2181 -e KAFKA_CREATE_TOPICS=testtopic:1:1 confluent/kafka
注意:在第二种方法中,您应该用作主机名并公开(发布)第一个容器的端口,以使其在本地主机上可用host.docker.internal
2181
评论
KAFKA_CREATE_TOPICS
对这些容器无效,此外,此处不需要 docker 主机 DNS 名称
有多种方法可以做到这一点。但在我们研究它之前,你需要了解你的方法中有两个问题
zookeper
使用时无法访问主机,因为每个容器都在不同的网络隔离中运行docker run
kafka
可以启动并尝试连接到,但尚未准备就绪zookeeper
zookeeper
解决网络问题
你可以做很多事情来解决问题
用于在主机网络上运行两者--net=host
使用,然后在启动两个容器时使用docker network create <name>
--net=<name>
或者,您可以在容器网络上运行 kafka 容器。zookeeper
启动容器时使用。这将确保主机是可访问的。除非您有充分的理由这样做,否则不建议这样做。因为一旦容器出现故障,容器的网络也会出现故障。但为了理解起见,我把这个选项放在这里--net=container:zookeeper
kafka
zookeeper
zookeeper
kafka
解决创业竞争问题
您可以在 start 和 之间保持间隙,以确保 start 何时启动并运行zookeeper
kafka
kafka
zookeeper
另一种选择是将标志与 docker run 一起使用。这将确保容器在发生故障时重新启动,并尝试重新连接到容器,并希望时间已经结束。--restart=on-failure
zookeeper
zookeeper
与其使用,我总是希望运行这样的链接容器。您可以通过创建一个简单的文件,然后运行它来做到这一点docker run
docker-compose
docker-compose.yml
docker-compsoe up
version: "3.4"
services:
zookeeper:
image: confluent/zookeeper
environment:
- ZOOKEEPER_CLIENT_PORT=2181
kafka:
image: confluent/kafka
environment:
- KAFKA_ADVERTISED_HOST_NAME=kafka
- KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
- KAFKA_CREATE_TOPICS=testtopic:1:1
depends_on:
- zookeeper
restart: on-failure
评论
docker run -e ZOOKEEPER_CLIENT_PORT=2181 --name zookeeper confluent/zookeeper
其次是没有用。并显示“无法连接到 zookeeper:2181”docker run --name kafka -e KAFKA_ADVERTISED_HOST_NAME=kafka -e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 -e KAFKA_CREATE_TOPICS=testtopic:1:1 --net=container:zookeeper confluent/kafka
localhost:2181
不过,我在 Mac 上运行,这工作正常。由于“主机”网络在 Mac 中不起作用,我只是创建一个名为的网络并将容器放在那里。kafka_net
version: "3.4"
services:
zookeeper:
image: confluent/zookeeper
environment:
- ZOOKEEPER_CLIENT_PORT=2181
networks:
- kafka_net
kafka:
image: confluent/kafka
environment:
- KAFKA_ADVERTISED_HOST_NAME=kafka
- KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
depends_on:
- zookeeper
networks:
- kafka_net
restart: on-failure
networks:
kafka_net:
driver: "bridge"
为确保一切正常,请执行以下操作:
然后登录到 zookeeper 容器
zookeeper-shell localhost:2181 => You should see something like 'Welcome to ZooKeeper!' after all the big chunk of text
然后登录到 kafka 容器
kafka-topics --zookeeper zookeeper:2181 --list # empty list
kafka-topics --zookeeper zookeeper:2181 --create --topic first_topic --replication-factor 1 --partitions 1
kafka-topics --zookeeper zookeeper:2181 --list # you will see the first_topic
kafka-console-producer --broker-list localhost:9092 --topic first_topic # type some text and ctrl + c
kafka-console-consumer --bootstrap-server localhost:9092 --zookeeper zookeeper:2181 --topic first_topic --from-beginning # you will see the stuff you typed first_topic
如果仍然给出问题,请查看官方示例。https://github.com/confluentinc/cp-docker-images/tree/5.2.2-post/examples 仍然给问题发布它,会伸出援手。
docker network create kafka-zookeeper
等到网络创建完成
docker run -it -d --network=kafka-zookeeper --name zookeeper zookeeper
等到 ZooKeeper 启动并运行
docker run -it -d --network=kafka-zookeeper --name kafka -e KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181 --restart=on-failure -e ALLOW_PLAINTEXT_LISTENER=yes -e KAFKA_CFG_LISTENERS=PLAINTEXT://:9092 -e KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 bitnami/kafka
Kafka 应该连接正常。
它们在 -d 分离模式下运行,因此您需要转到 Docker Desktop 查看每个容器的日志。
评论
confluentinc/kafka
confluentinc/kafka
confluentinc/zookeeper