kafka-python生成器在docker容器中运行时无法发送

时间:2018-02-15 20:58:16

标签: python-3.x docker apache-kafka elastic-beanstalk kafka-python

我在Flask应用程序中使用kafka-pythonpip install kafka-python)将消息发送到Kafka群集(运行版本0.11)。该应用程序通过AWS elastic beanstalk部署到docker。但是,我看不到任何消息到达Kafka(通过控制台消费者验证)。

除了如何连接到正在运行的容器之外,我对docker了解不多。这就是我做的。我登录到beanstalk实例,然后连接到docker容器。在那里,我在Python3中运行了以下命令。

>> from kafka import KafkaProducer
>> p = KafkaProducer(bootstrap_servers='my_kafka_servers:9092', compression_type='gzip')
>> r = p.send(topic = 'my_kafka_topic', value = 'message from docker', key = 'docker1')
>> r.succeeded()
>> False
>> p.flush()
>> r.succeeded()
>> False
>> p.close()
>> r.succeeded()
>> False

所有这一切,我有一个控制台消费者正在运行听取该主题,但我没有看到任何消息。

我在docker容器“之外”(即在beanstalk实例中)进行了相同的练习。我首先使用pip安装了kafka-python。然后在python3中运行以下命令。

>> from kafka import KafkaProducer
>> p = KafkaProducer(bootstrap_servers='my_kafka_servers:9092', compression_type='gzip')
>> r = p.send(topic = 'my_kafka_topic', value = 'message outside the docker', key = 'instance1')
>> r.succeeded()
>> False
# waited a second or two
>> r.succeeded()
>> True

这一次,我确实看到了消息来自控制台消费者。

所以,我的问题是:

  1. 为什么docker阻止了kafka制作人的发送?
  2. 我该如何解决这个问题?
  3. 这是我需要发布docker配置的东西吗?我没有设置它,所以没有那个信息。

    修改 我在项目中找到了一些docker配置特定信息。

    {
      "AWSEBDockerrunVersion": "1",
      "Image": {
        "Name": "<AWS_ACCOUNT_ID>.dkr.ecr.<REGION>.amazonaws.com/<NAME>:<VERSION>",
        "Update": "true"
      },
      "Ports": [
        {
          "ContainerPort": "80"
        }
      ],
      "Logging": "/var/eb_log"
    }
    

2 个答案:

答案 0 :(得分:0)

您必须将docker容器绑定到本地计算机。这可以通过使用docker run as:

来完成

docker run --rm -p 127.0.0.1:2181:2181 -p 127.0.0.1:9092:9092 -p 127.0.0.1:8081:8081 .... 或者,您可以使用带有绑定IP的docker run:

docker run --rm -p 0.0.0.0:2181:2181 -p 0.0.0.0:9092:9092 -p 0.0.0.0:8081:8081 .....

如果您想在您的网络上使docker容器可路由,您可以使用:

docker run --rm -p <private-IP>:2181:2181 -p <private-IP>:9092:9092 -p <private-IP>:8081:8081 ....

或者最后你可以使用以下方法来控制你的网络接口:

docker run --rm -p 2181:2181 -p 9092:9092 -p 8081:8081 --net host ....

答案 1 :(得分:0)

如果要绑定Elastic Beanstalk和Docker上的端口,则需要使用仅适用于多容器环境的版本2。我遇到了与上述相同的问题,如果上面的修复有效,我很好奇。