我正在使用 kafka-python
( pip install kafka-python
)在flask应用程序中,向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示例中)。我第一次安装 kafka-python
使用pip。然后在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
这一次,我确实看到了来自控制台使用者的消息。
所以,我的问题是:
为什么docker要阻止Kafka制作人的发送?
我怎样才能解决这个问题?
这是我需要发布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条答案
按热度按时间wz1wpwve1#
您必须将docker容器绑定到本地计算机。这可以通过使用docker运行方式完成:
docker run --rm -p 127.0.0.1:2181:2181 -p 127.0.0.1:9092:9092 -p 127.0.0.1:8081:8081 ....
或者,您可以将docker run与绑定ip一起使用: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 ....
ffdz8vbo2#
如果你想在ElasticBeanstalk和docker上绑定端口,你需要使用版本2,它只适用于多容器环境。我有同样的问题,上述和好奇,如果上述修复工程。