Python无法通过Docker

时间:2015-12-30 00:23:45

标签: python docker cassandra pycharm datastax

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

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 Container Port Mappings:

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在localhost / 127.0.0.1:9042上开始侦听CQL客户端 INFO 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")})

根据其他帖子中的建议,我尝试调整cassandra.yaml中的listen_address,但这样做无法解决问题。 docker-machine IP地址:

listen_address: 192.168.99.101

也不是泊坞窗容器的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)...

到目前为止,我发现this poster发生了类似的错误,而其他一些人则因其他error hereerror here而拒绝连接。还有一个帖子可以将问题与cassandra-driver works with pycharm的潜在联系起来。但到目前为止,我解决此配置问题的所有尝试都失败了,即使我在pycharm外部运行python,问题仍然存在。我有其他容器在同一个docker机器上的不同端口上运行,客户端连接到容器没有任何问题,只是cassandra。

任何人都可以帮助我理解为什么python拒绝连接到Cassandra? 而且,我能做些什么来解决它?

1 个答案:

答案 0 :(得分:3)

在发现thread on grokbase处理了让Cassandra在接口而不是本地主机地址上侦听端口9042的问题后,我找到了可行的配置设置。

查找容器的私有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

虽然这适用于在VirtualBox中的Docker容器中运行的单节点,但是当部署到ec2或链接到群集中的其他节点时,此配置不太可能正常工作。