Python无法通过Docker连接到Cassandra

我已经能够在Windows本地主机端口上启动Cassandra,并使用cassandra-driver模块连接到它。 但是,当我尝试通过Docker容器连接到Cassandra时,我收到以下连接拒绝exception:

cassandra.cluster.NoHostAvailable: ('Unable to connect to any servers', {'192.168.99.101': ConnectionRefusedError(10061, "Tried connecting to [('192.168.99.101', 9042)]. Last error: No connection could be made because the target machine actively refused it")}) 

这是我的设置:

系统:
Windows 8.1
Docker 1.9.1
Virtualbox 4.3.34
Python 3.5.1
Cassandra 3.0.2
Cassandra-Driver 3.0.0

Dockerfile: https ://hub.docker.com/r/rc42/lab-cassandra/~/dockerfile/

docker集装箱港口映射:

 7000/tcp -> 0.0.0.0:7000 7001/tcp -> 0.0.0.0:7001 7199/tcp -> 0.0.0.0:7199 9042/tcp -> 0.0.0.0:9042 9160/tcp -> 0.0.0.0:9160 

Docker-Machine IP

 192.168.99.101 

cassandra.yaml(默认设置)

listen_address:localhost

当我在容器中初始化cassandra时,我收到一个正常的结果:

 cassandra -f 

INFO 22:38:18开始监听本地主机上的CQL客户端/ 127.0.0.1:9042信息22:38:18不按要求启动RPC服务器。 使用JMX(StorageService – > startRPCServer())或nodetool(enablethrift启动它)

但是,当我尝试使用python脚本连接到它时,它拒绝我的连接:

 from cassandra.cluster import Cluster cluster = Cluster(['192.168.99.101']) session = cluster.connect() cassandra.cluster.NoHostAvailable: ('Unable to connect to any servers', {'192.168.99.101': ConnectionRefusedError(10061, "Tried connecting to [('192.168.99.101', 9042)]. Last error: No connection could be made because the target machine actively refused it")}) 

根据其他post的build议,我试图调整cassandra.yaml中的listen_address,但是这样做一直没能解决问题。 docker机IP地址:

 listen_address: 192.168.99.101 

也不是docker集装箱的IP地址:

 listen_address: 172.17.0.2 

解决问题。 奇怪的是,即使我把listen_address设置为172.17.0.2,启动时的stdout是:

 INFO 19:42:19 Starting listening for CQL clients on localhost/127.0.0.1:9042 (unencrypted)... 

到目前为止,我发现这个海报发生了一个类似的错误,其他许多人正在拒绝他们的连接,在这里有一个不同的错误和错误 。 还有一篇文章将问题与潜在的cassandra-driver如何与pycharm结合起来 。 但到目前为止,我所有的解决这个configuration问题的尝试都失败了,即使我在pycharm之外运行python,也会出现问题。 我有其他容器运行在同一个docker机器上的不同端口,客户端没有任何问题连接到容器,只是cassandra。

谁能帮我理解为什么python拒绝连接到Cassandra?
而且,我能做些什么来解决它?

在发现一个线程在grokbase ,处理问题获取Cassandra侦听端口9042在接口而不是本地主机地址,我能find一个configuration设置的工作。

find私人的IP容器:

 CONTAINER_IP=`docker inspect -f '{{ .NetworkSettings.IPAddress }}' container` 

编辑cassandra.yaml文件:

 seed: "CONTAINER_IP" listen_address: CONTAINER_IP broadcast_address: CONTAINER_IP start_rpc: true rpc_address: 0.0.0.0 broadcast_address: CONTAINER_IP 

尽pipe这适用于在VirtualBox中的Docker容器中运行的单节点,但是该configuration不太可能在部署到ec2或连接到群集中的其他节点时起作用。