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

fuz*_*zzi 5 apache-kafka docker 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?

Tar*_*ani 7

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

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

解决网络问题

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

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

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

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

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

解决启动竞争问题

您可以在启动zookeeper和之间保持一个间隙kafka,以确保kafka启动zookeeper和运行时

另一种选择是在--restart=on-failuredocker 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
Run Code Online (Sandbox Code Playgroud)