《Spring in Action第6版》Docker Cassandra CQLSH命令遇socket.gaierror错误求助
问题描述
按照《Spring in Action(第六版)》第96页指引,在VS Code终端执行以下Docker命令:
docker network create cassandra-net docker run --name my-cassandra --network cassandra-net -p 9042:9042 -d cassandra:latest
容器日志显示已创建默认超级用户角色'cassandra',判断Cassandra集群已完全启动。但执行命令:
docker run -it --network cassandra-net --rm cassandra cqlsh my-cassandra
时出现如下错误:
Traceback (most recent call last): File "/opt/cassandra/bin/cqlsh.py", line 2402, in <module> main(*read_options(sys.argv[1:], os.environ)) File "/opt/cassandra/bin/cqlsh.py", line 2344, in main shell = Shell(hostname, File "/opt/cassandra/bin/cqlsh.py", line 480, in __init__ load_balancing_policy=WhiteListRoundRobinPolicy([self.hostname]), File "/opt/cassandra/bin/../lib/cassandra-driver-internal-only-3.25.0.zip/cassandra-driver-3.25.0/cassandra/policies.py", line 425, in __init__ File "/opt/cassandra/bin/../lib/cassandra-driver-internal-only-3.25.0.zip/cassandra-driver-3.25.0/cassandra/policies.py", line 426, in <listcomp> File "/usr/lib/python3.10/socket.py", line 955, in getaddrinfo for res in _socket.getaddrinfo(host, port, family, type, proto, flags): socket.gaierror: [Errno -2] Name or service not known
搜索相关错误后找到的方案多针对GitHub托管场景,不适用于本地VS Code终端环境,请问哪里遗漏了?
解决方案
- 确认容器归属的网络:执行
docker inspect my-cassandra | grep Networks,检查输出是否包含cassandra-net,如果没有,说明容器未加入指定网络,需重新启动容器并指定该网络。 - 用容器IP替代容器名:Docker网络内的容器名解析偶尔会出现异常,先获取容器IP:
再用该IP执行连接命令:docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-cassandradocker run -it --network cassandra-net --rm cassandra cqlsh <获取到的容器IP> - 确认Cassandra完全启动:日志显示创建超级用户不代表服务完全就绪,查看容器日志末尾是否有
Ready for connections类输出,等待1-2分钟后再尝试连接。 - 直接进入容器内部执行cqlsh:跳过跨容器网络解析问题,执行:
docker exec -it my-cassandra cqlsh - 宿主机直接连接:如果本地安装了cqlsh,利用映射的9042端口直接连接:
cqlsh localhost 9042 -u cassandra -p cassandra
内容的提问来源于stack exchange,提问作者Joshua Draper
相关产品推荐
相关产品推荐

