访问自定义网络中docker容器的IP地址

时间:2017-09-23 14:53:17

标签: docker apache-kafka

我正在使用docker compose来启动kafka和zookeeper

我的docker-compose如下:

version: '3'
services:
  zookeeper:
    image: zookeeper:3.4
    networks:
      - pipeline

  kafka:
    image: ches/kafka
    networks:
      - pipeline
    environment:
      - ZOOKEEPER_IP=zookeeper
    ports:
      - "9092:9092"
    links:
      - zookeeper:zookeeper
    depends_on:
      - zookeeper

networks:
  pipeline:

因此,这启动了一个运行zookeeper的容器,并启动了一个运行kafka服务器的容器,该容器成功连接到zookeeper。

此外,我可以成功创建一个kafka生产者和一个kafka消费者,通过以下命令相互通信:

制片:

docker run --rm -it --network pipeline_pipeline ches/kafka \
    kafka-console-producer.sh --topic pipeline-dev \
    --broker-list kafka:9092

消费者:

docker run --rm --network pipeline_pipeline ches/kafka \
    kafka-console-consumer.sh --topic pipeline-dev \
    --from-beginning \
    --bootstrap-server kafka:9092

现在我面临的问题是,在配置中,kafka服务器上的ADVERTISED HOST设置为kafka,这阻止我从本地连接到kafka服务器。

我正在使用kafka-python库以下列方式连接到kafka:

from kafka import KafkaConsumer

consumer = KafkaConsumer('pipeline-dev', bootstrap_servers='localhost:9092')

print 'starting to listen'
for msg in consumer:
    print msg

但是在这里我得到了Brokers不可用的错误!那是因为我将引导服务器设置为localhost:9092。即使我转发了端口,我也无法连接到kafka服务器,因为广告主机名是kafka而不是localhost

将引导服务器设置为kafka:9092不起作用,因为代码在本地而不是在docker网络中运行。

我不知道如何解决这个问题。

1 个答案:

答案 0 :(得分:2)

/etc/hosts中输入主机条目,如下所示

127.0.0.1 kafka

当你想在docker主机上使用你的代码时,上面的代码将会起作用。如果你想在其他机器上使用它,那么你应该使用

<DockerHostIP> kafka

基本上,当广告名称返回kafka

时,您希望解析名称