Python 无法通过 Docker 连接到 Cassandra

Posted

技术标签:

【中文标题】Python 无法通过 Docker 连接到 Cassandra【英文标题】:Python Unable to Connect to Cassandra through Docker 【发布时间】:2016-04-03 22:31:36 【问题描述】:

我已经能够在 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"))

这是我的设置:

系统: 视窗 8.1 Docker 1.9.1 Virtualbox 4.3.34 Python 3.5.1 卡桑德拉 3.0.2 Cassandra-Driver 3.0.0

Docker 文件: 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-机器 IP

192.168.99.101

cassandra.yaml(默认设置)

listen_address: 本地主机

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

cassandra -f

INFO 22:38:18 开始在 localhost/127.0.0.1:9042 上监听 CQL 客户端 信息 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

也不是 docker 容器 IP 地址:

listen_address: 172.17.0.2

解决问题。奇怪的是,即使我将 listen_address 设置为 172.17.0.2,启动时的标准输出是:

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

到目前为止,我发现this poster 发生了类似的错误,并且其他一些人的连接被不同的error here 和error here 拒绝。还有一篇文章将问题与cassandra-driver works with pycharm 的潜在方式联系起来。但是到目前为止,我解决此配置问题的所有尝试都失败了,即使我在 pycharm 之外运行 python 也会出现问题。我有其他容器在同一台 docker 机器上的不同端口上运行,客户端连接到容器没有任何问题,只是 cassandra。

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

【问题讨论】:

出于好奇,你能用pycharm以外的东西连接吗? 我尝试通过我的终端运行相同的脚本,但它返回相同的错误。但是,当我在容器内运行 cqlsh 时,我收到一个正常的“在 127.0.0.1:9042 连接到测试集群”,所以我知道 Cassandra 运行正常。奇怪的是,即使我将 172.17.0.2 指定为 yaml 文件中的 listen_address,我在启动时仍收到以下消息:INFO 19:42:19 开始在 localhost/127.0.0.1:9042 上侦听 CQL 客户端(未加密).. . 【参考方案1】:

在发现 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 或链接到集群中的其他节点时不太可能有效。

【讨论】:

以上是关于Python 无法通过 Docker 连接到 Cassandra的主要内容,如果未能解决你的问题,请参考以下文章

无法通过 DataGrip 应用程序连接到 MySQL docker 实例

无法通过docker上的学说连接到mysql DB

Mariadb docker容器无法使用Python连接到主机上的MySQL服务器(111连接被拒绝)

节点无法通过 Docker Compose 连接到 Redis

节点服务器无法通过 Docker 连接到 Postgres,使用 TypeORM

无法连接到docker mongodb