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

lztngnrs  于 2021-06-06  发布在  Kafka
关注(0)|答案(3)|浏览(1683)

我想两者都用 confluent/kafka 以及 confluent/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 and Kafka大道kafka:9092 ?

uujelgoq

uujelgoq1#

docker启动隔离网络中的容器,称为 default bridge 除非明确指定网络。
你可以通过不同的方式获得成功,这里有两个最简单的方法:
将容器放入同一用户定义的网桥网络中


# 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

暴露端口并通过本地主机连接

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 对于第一个使其在本地主机上可用的容器

ngynwnxp

ngynwnxp2#

不过我用的是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 而且还在发帖,会出手的。

s8vozzvw

s8vozzvw3#

有多种方法可以做到这一点。但在我们研究它之前,您需要了解您的方法中有两个问题 zookeper 使用时无法访问主机 docker run 因为每个容器都在不同的网络隔离中运行 kafka 可能会启动并尝试连接到 zookeeper 但是 zookeeper 还没准备好

解决网络问题

你可以做很多事情来解决问题
使用 --net=host 在主机网络上同时运行
使用 docker network create <name> 然后使用 --net=<name> 同时发射两个集装箱
或者你可以在电脑上运行你的Kafka容器 zookeeper 集装箱网络。
使用 --net=container:zookeeper 启动时 kafka 容器。这将确保 zookeeper 主机可访问。除非你有充分的理由这样做,否则不建议这样做。因为一旦 zookeeper 集装箱倒了,你的网络也会倒 kafka 容器。但为了理解,我把这个选项放在这里

解决创业竞赛问题

或者你可以在两个开始之间保持一个间隔 zookeeper 以及 kafka ,以确保 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

相关问题