使用另一个容器连接Cassandra容器

时间:2019-02-26 00:39:59

标签: python docker cassandra containers

我正在尝试连接到Cassandra容器,并由自己构建的另一个容器将数据插入数据库。我通过

运行Cassandra容器
docker pull Cassandra
docker run --name some-cassandra -p 9042:9042 -d cassandra:latest"

这是我尝试在python程序中连接到Cassandra的代码。

cluster = Cluster(contact_points=['127.0.0.1'],port=9042)
session = cluster.connect()

如果我直接在Mac上运行该程序,它将连接,但是如果将其构建到容器中,它将返回错误:

raise NoHostAvailable("Unable to connect to any servers", errors)
cassandra.cluster.NoHostAvailable: ('Unable to connect to any servers', {'127.0.0.1': ConnectionRefusedError(111, "Tried connecting to [('127.0.0.1', 9042)]. Last error: Connection refused")})

我通过

构建和运行容器
docker build --tag=restful .
docker run -p 4000:80 restful

我是docker的新手,我在徘徊什么是让这两个容器连接和通信的正确方法?

1 个答案:

答案 0 :(得分:1)

Docker容器旨在与主机和彼此隔离。

您的Cassandra数据库在容器内部以及主机上的端口9042上运行。参数-p 9042:9042告诉Docker将内部端口9042与主机端口9042绑定。这就是为什么当您从主机(不在任何容器中)运行python脚本时,127.0.0.1:9042与您的容器连接的原因。 / p>

将相同的python脚本放在单独的容器中时,IP地址127.0.0.1不再指向主机,而是指向当前容器。您的python脚本无法仅由于两者相互隔离而无法连接到Cassandra容器。

有两种可能的解决方案:

  1. 使用docker create network test_net创建网络。然后通过在--network=test_net命令中添加参数docker run将两个容器都链接到该网络。最后,通过将127.0.0.1替换为Cassandra容器some-cassandra的名称来更新python脚本。

  2. (不推荐),通过--network=host启动绑定到主机网络的python脚本容器,以便127.0.0.1现在指向主机网络。