我的 kafka docker 容器无法连接到我的 zookeeper docker 容器

My kafka docker container cannot connect to my zookeeper docker container

提问人:fuzzi 提问时间:6/7/2019 更新时间:2/3/2023 访问量:11840

问:

我想同时使用两者,并在单个 Ubuntu 服务器上运行它们。confluent/kafkaconfluent/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 apache-kafka apache-zookeeper

评论

1赞 OneCricketeer 6/8/2019
这两个容器均已弃用。使用 和 Zookeeper .另外,请使用 Docker compose 并阅读此博客 rmoff.net/2018/08/02/kafka-listeners-explainedconfluentinc/kafka
0赞 fuzzi 6/10/2019
谢谢@cricket_007 - 我正在使用 docker compose,但映像开始失败(它一直工作到上周),所以我一直在按照上面的方式运行映像以帮助调试失败的容器。我将尝试上面的命令,使用 和confluentinc/kafkaconfluentinc/zookeeper

答:

1赞 grapes 6/7/2019 #1

Docker 在隔离网络中启动容器,除非显式指定 network,否则调用。default bridge

您可以通过不同的方式取得成功,这里有 2 种最简单的方式:

  1. 将容器放入同一个用户定义的桥接网络中

    # 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
    
  2. 公开端口并通过 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.internal2181

评论

0赞 fuzzi 6/8/2019
我尝试了第一个选项,当运行第二行时,它会抛出“org.I0Itec.zkclient.exception.ZkException:无法连接到 zookeeper:2181”
0赞 fuzzi 6/8/2019
我尝试了第二个选项,但我也得到了无法连接到 zookeeper:2181
0赞 OneCricketeer 6/8/2019
KAFKA_CREATE_TOPICS对这些容器无效,此外,此处不需要 docker 主机 DNS 名称
16赞 Tarun Lalwani 6/26/2019 #2

有多种方法可以做到这一点。但在我们研究它之前,你需要了解你的方法中有两个问题

  • zookeper使用时无法访问主机,因为每个容器都在不同的网络隔离中运行docker run
  • kafka可以启动并尝试连接到,但尚未准备就绪zookeeperzookeeper

解决网络问题

你可以做很多事情来解决问题

用于在主机网络上运行两者--net=host

使用,然后在启动两个容器时使用docker network create <name>--net=<name>

或者,您可以在容器网络上运行 kafka 容器。zookeeper

启动容器时使用。这将确保主机是可访问的。除非您有充分的理由这样做,否则不建议这样做。因为一旦容器出现故障,容器的网络也会出现故障。但为了理解起见,我把这个选项放在这里--net=container:zookeeperkafkazookeeperzookeeperkafka

解决创业竞争问题

您可以在 start 和 之间保持间隙,以确保 start 何时启动并运行zookeeperkafkakafkazookeeper

另一种选择是将标志与 docker run 一起使用。这将确保容器在发生故障时重新启动,并尝试重新连接到容器,并希望时间已经结束。--restart=on-failurezookeeperzookeeper

与其使用,我总是希望运行这样的链接容器。您可以通过创建一个简单的文件,然后运行它来做到这一点docker rundocker-composedocker-compose.ymldocker-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

评论

0赞 fuzzi 7/13/2019
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
0赞 Tarun Lalwani 7/13/2019
你是在延迟后完成的吗?
0赞 fuzzi 7/13/2019
是的,我执行了第一个命令,它显示:“INFO binding to port 0.0.0.0/0.0.0.0:2181”,然后等待 2 分钟,检查它是否仍在运行,然后执行第二个命令。
0赞 Tarun Lalwani 7/13/2019
然后尝试localhost:2181
0赞 fuzzi 7/13/2019
谢谢,有效!不过,我希望这与动物园管理员一起工作。因此,也许还有另一个环境变量可以与动物园管理员advertised_name。
3赞 Ntwobike 6/26/2019 #3

不过,我在 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 仍然给问题发布它,会伸出援手。

0赞 JCompetence 2/3/2023 #4
 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 查看每个容器的日志。