我想同时使用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访问zookeeper,如何通过kafka:9092访问kafka?
答案 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
容器的网络也会随之下降。但是为了理解,我在这里放了这个选项
您可以在开始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
答案 1 :(得分:0)
除非明确指定网络,否则Docker将在称为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
,以使其在本地主机上可用
答案 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并仍然发表问题,将会伸出援手。