我在Flask应用程序中使用kafka-python
(pip 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
这一次,我确实看到了消息来自控制台消费者。
所以,我的问题是:
这是我需要发布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"
}
答案 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。我遇到了与上述相同的问题,如果上面的修复有效,我很好奇。