【问题标题】:kafka-python producer not able to send when run in a docker container在 docker 容器中运行时,kafka-python 生产者无法发送
【发布时间】:2018-07-26 17:39:02
【问题描述】:

我在 Flask 应用程序中使用 kafka-python (pip install kafka-python) 将消息发送到 Kafka 集群(运行版本 0.11)。该应用程序通过docker 部署到AWS elastic beanstalk。但是,我没有看到任何消息到达 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. 我该如何解决这个问题?

这是我需要发布 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"
}

【问题讨论】:

  • 你是如何运行docker组件的,有没有命令说明?

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


【解决方案1】:

您必须将 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 ....

【讨论】:

  • 你能看看我对这个问题发表的编辑吗?该配置是否有助于理解为什么会出现此问题?有没有办法可以使用这个文件提供绑定?
  • 当然,我会编辑答案并将您应该添加到 docker 的配置添加到打开端口 :)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 2013-03-02
    • 2018-04-19
    • 2017-01-26
    相关资源
    最近更新 更多