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

时间:2019-06-07 15:05:30

标签: docker apache-kafka apache-zookeeper

我想同时使用confluent/kafkaconfluent/zookeeper并在单个Ubuntu服务器上运行它们。

我正在使用以下配置:

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?

3 个答案:

答案 0 :(得分:2)

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

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

解决网络问题

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

使用--net=host在主机网络上同时运行

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

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

在启动--net=container:zookeeper容器时使用kafka。这将确保zookeeper主机可访问。除非您有充分的理由这样做,否则不建议这样做。因为zookeeper容器一旦关闭,您的kafka容器的网络也会随之下降。但是为了理解,我在这里放了这个选项

解决启动竞赛问题

您可以在开始zookeeperkafka之间保持一定距离,以确保kafka开始zookeeper启动并运行

另一种选择是将--restart=on-failure标志用于docker run。这样可以确保容器在发生故障时重新启动,并尝试重新连接到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

答案 1 :(得分:0)

除非明确指定网络,否则Docker将在称为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.internal作为主机名,并为第一个容器公开(发布)端口2181,以使其在本地主机上可用

答案 2 :(得分:0)

尽管我在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并仍然发表问题,将会伸出援手。