英文:
Golang with Cassandra db using docker-compose : cannot connect (gocql)
问题
我正在尝试设置一个Cassandra数据库,并使用Golang应用程序连接到它。
这是我的docker-compose
文件:
version: "3.6"
services:
cassandra:
image: cassandra:4.0
ports:
- 9042:9042
volumes:
- ~/apps/cassandra:/var/lib/cassandra
environment:
- CASSANDRA_CLUSTER_NAME=mycluster
myapp:
...
ports:
- 4242:4242
- 4243:4243
depends_on:
- cassandra
...
networks:
default:
driver: bridge
我使用以下命令启动Cassandra:
docker-compose up cassandra
然后我等待它准备就绪。
然后我尝试在本地连接到Cassandra:
> cqlsh
Connected to mycluster at 127.0.0.1:9042
然后我尝试在我的Go应用程序(容器化)中使用gocql
连接到它:
cluster := gocql.NewCluster("127.0.0.1")
session, err := cluster.CreateSession()
(也尝试添加Consistency
、ProtoVersion=4
等元素,结果相同)
然后它显示:
Cannot connect to db: gocql: unable to create session: unable to discover protocol version: dial tcp 127.0.0.1:9042: connect: connection refused
你有任何想法为什么无法连接吗?
谢谢!
英文:
I am trying to setup a cassandra DB and connect to it with a golang app.
this is my docker-compose
version: "3.6"
services:
cassandra:
image: cassandra:4.0
ports:
- 9042:9042
volumes:
- ~/apps/cassandra:/var/lib/cassandra
environment:
- CASSANDRA_CLUSTER_NAME=mycluster
myapp:
...
ports:
- 4242:4242
- 4243:4243
depends_on:
- cassandra
...
networks:
default:
driver: bridge
I start the Cassandra using
docker-compose up cassandra
and then I wait it to be ready.
Then I try to connect to Cassandra in local using
> cqlsh
Connected to mycluster at 127.0.0.1:9042
and then I try to connect to it in my go app (dockerized) using gocql
cluster := gocql.NewCluster("127.0.0.1")
session, err := cluster.CreateSession()
( also tried to add element as Consistency
, ProtoVersion=4
etc. same results)
it says then :
Cannot connect to db: gocql: unable to create session: unable to discover protocol version: dial tcp 127.0.0.1:9042: connect: connection refused
Do you. have any idea why it can't connect?
thanks !
答案1
得分: 3
每个容器都有自己的本地主机地址(127.0.0.1
)- 您需要连接到您的机器的IP地址(如果使用bridge
),或者更好的是通过名称连接(cassandra
)。
英文:
Each container has its own localhost (127.0.0.1
) address - you need to connect to IP address of your machine (if you use bridge
), or maybe better to connect by the name (cassandra
)
答案2
得分: 0
如果两个容器都使用桥接网络,你需要在两个容器中指定网络名称,并且在你的应用容器中,主机名称将是cassandra(docker)容器。
services:
cassandra:
image: cassandra:4.0
container_name: cassandra
ports:
- 9042:9042
volumes:
- ~/apps/cassandra:/var/lib/cassandra
networks:
- default
environment:
- CASSANDRA_CLUSTER_NAME=mycluster
myapp:
...
ports:
- 4242:4242
- 4243:4243
depends_on:
- cassandra
networks:
- default
environment:
- HOSTS=cassandra
...
networks:
default:
driver: bridge
以上是要翻译的内容。
英文:
If both containers using bridge network you need to specify the network name in both containers and in your app container the host will be cassandra (docker) container.
services:
cassandra:
image: cassandra:4.0
container_name: cassandra
ports:
- 9042:9042
volumes:
- ~/apps/cassandra:/var/lib/cassandra
networks:
- default
environment:
- CASSANDRA_CLUSTER_NAME=mycluster
myapp:
...
ports:
- 4242:4242
- 4243:4243
depends_on:
- cassandra
networks:
- default
environment:
- HOSTS=cassandra
...
networks:
default:
driver: bridge
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论