我正在尝试连接到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的新手,我在徘徊什么是让这两个容器连接和通信的正确方法?
答案 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容器。
有两种可能的解决方案:
使用docker create network test_net
创建网络。然后通过在--network=test_net
命令中添加参数docker run
将两个容器都链接到该网络。最后,通过将127.0.0.1
替换为Cassandra容器some-cassandra
的名称来更新python脚本。
(不推荐),通过--network=host
启动绑定到主机网络的python脚本容器,以便127.0.0.1
现在指向主机网络。