[英]Cannot connect to local datastax cassandra running in docker
[英]Cannot connect to Cassandra running in a Docker container
对于我的应用程序,有一个运行 Cassandra 的 Docker 容器database
。我将端口9160
和9042
公开给主机,但由于某种原因,我无法从主机连接到 Cassandra。 仅当我将其他容器放在 same.network 中时,我才能使用cqlsh
从其他 Docker 容器连接到它。
我的docker-compose
文件(我用docker-compose up
运行):
database:
image: cassandra
container_name: database
depends_on:
- kafka
ports:
- 9042:9042
- 9160:9160
volumes:
- ./:/code
environment:
- CASSANDRA_START_RPC=true
- CASSANDRA_BROADCAST_ADDRESS=database
entrypoint: "/code/scripts/cassandra.sh"
frontend:
container_name: frontend
build:
context: driver/
volumes:
- ./:/code
network_mode: service:database
environment:
- BOOTSTRAP_SERVER=kafka:9092
- CASSANDRA_HOST=localhost
entrypoint: "/code/scripts/frontend.sh"
其中cassandra.sh
和frontend.sh
通过运行脚本简单地初始化数据库,并分别安装一些包。
使用上述设置,我可以通过简单地在frontend
容器中调用cqlsh
来使用 cqlsh。 但是,如果我从frontend
删除network_mode: service:database
行,并尝试使用cqlsh database
或cqlsh $CASSANDRA_HOST
进行连接,即使在我设置CASSANDRA_HOST=database
之后也是如此。 执行上述任何命令都会给我:
Connection error: ('Unable to connect to any servers', {'172.27.0.5:9042': ConnectionRefusedError(111, "Tried connecting to [('172.27.0.5', 9042)]. Last error: Connection refused")})
。
因此,即使我公开了端口 9042,我也无法从主机运行cqlsh
。主机是运行 macOS Monterey 12.3.1 的 2020 iMac。:
> netstat -anvp tcp | awk 'NR<3 || /LISTEN/'
Active Internet connections (including servers)
Proto Recv-Q Send-Q Local Address Foreign Address (state) rhiwat shiwat pid epid state options
tcp46 0 0 *.29092 *.* LISTEN 131072 131072 911 0 0x0100 0x00000006
tcp4 0 0 127.0.0.1.9042 *.* LISTEN 131072 131072 7099 0 0x0100 0x00000006
tcp4 0 0 127.0.0.1.7000 *.* LISTEN 131072 131072 7099 0 0x0100 0x00000006
tcp4 0 0 127.0.0.1.54196 *.* LISTEN 131072 131072 7099 0 0x0100 0x00000006
tcp4 0 0 127.0.0.1.7199 *.* LISTEN 131072 131072 7099 0 0x0100 0x00000006
tcp46 0 0 *.8080 *.* LISTEN 131072 131072 911 0 0x0100 0x00000006
tcp46 0 0 *.7077 *.* LISTEN 131072 131072 911 0 0x0100 0x00000006
tcp46 0 0 *.4040 *.* LISTEN 131072 131072 911 0 0x0100 0x00000006
tcp46 0 0 *.9160 *.* LISTEN 131072 131072 911 0 0x0100 0x00000006
tcp46 0 0 *.9042 *.* LISTEN 131072 131072 911 0 0x0100 0x00000006
tcp46 0 0 *.2181 *.* LISTEN 131072 131072 911 0 0x0100 0x00000006
tcp4 0 0 127.0.0.1.6463 *.* LISTEN 131072 131072 1241 0 0x0100 0x00000106
tcp4 0 0 127.0.0.1.49390 *.* LISTEN 131072 131072 826 0 0x0100 0x00000106
tcp4 0 0 127.0.0.1.45623 *.* LISTEN 131072 131072 826 0 0x0100 0x00000106
tcp4 0 0 127.0.0.1.49380 *.* LISTEN 131072 131072 826 0 0x0100 0x00000106
tcp4 0 0 127.0.0.1.49379 *.* LISTEN 131072 131072 826 0 0x0100 0x00000106
tcp4 0 0 127.0.0.1.15292 *.* LISTEN 131072 131072 770 0 0x0000 0x0000020f
tcp6 0 0 *.5000 *.* LISTEN 131072 131072 465 0 0x0100 0x00000006
tcp4 0 0 *.5000 *.* LISTEN 131072 131072 465 0 0x0100 0x00000006
tcp6 0 0 *.7000 *.* LISTEN 131072 131072 465 0 0x0100 0x00000006
tcp4 0 0 *.7000 *.* LISTEN 131072 131072 465 0 0x0100 0x00000006
tcp6 0 0 *.49198 *.* LISTEN 131072 131072 494 0 0x0100 0x00000006
tcp4 0 0 *.49198 *.* LISTEN 131072 131072 494 0 0x0100 0x00000006
我花了几个小时为此寻找解决方案,并查看了 StackOverflow 和其他网站上关于该主题的几乎所有可能的帖子,但没有一个解决方案适合我。 我将不胜感激一些帮助。
问题是由设置入口点引起的:
entrypoint: "/code/scripts/cassandra.sh"
事实证明,如果没有提供入口点,某些 Cassandra 设置仅由图像初始化。 如果提供了,您必须自己设置这些设置,我没有这样做。 我添加了入口cassandra.sh
因为我想通过运行文件create.cql
来初始化数据库:
#!/bin/sh
cassandra -R
# Wait for Cassandra to start up
while ! cqlsh -e 'describe cluster' ; do
sleep 1
done
echo "Cassandra has started"
cqlsh --file '/code/scripts/create.cql'
echo "Cassandra has been initialised"
tail -f /dev/null
我最终创建了另一个 Docker 容器,它在数据库启动后简单地初始化数据库:
database:
image: cassandra
container_name: database
depends_on:
- kafka
ports:
- 9042:9042
- 9160:9160
volumes:
- ./:/code
db_seeder:
container_name: db_seeder
build:
context: db_seeder/
depends_on:
- database
volumes:
- ./:/code
environment:
- CASSANDRA_HOST=database
entrypoint: "/code/scripts/cassandra.sh"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.