Docker部署Cassandra时出现名称无法解析错误求助
问题场景
按官方快速指南操作时,执行cqlsh跨容器连接Cassandra出现名称无法解析错误,操作流程及报错如下:
- 执行
docker network create cassandra创建专属网络,执行正常 - 执行
docker run --rm -d --name cassandra --hostname cassandra --network cassandra cassandra启动Cassandra容器 - 执行连接命令
docker run --rm -it --network cassandra nuvo/docker-cqlsh cqlsh cassandra 9042 --cqlversion='3.4.5'时,触发报错:
Traceback (most recent call last):
File "/usr/local/bin/cqlsh", line 2816, in main(*read_options(sys.argv[1:], os.environ))
File "/usr/local/bin/cqlsh", line 2795, in main encoding=options.encoding)
File "/usr/local/bin/cqlsh", line 690, in init load_balancing_policy=WhiteListRoundRobinPolicy([self.hostname]),
File "/usr/local/lib/python2.7/site-packages/cassandra/policies.py", line 425, in init for endpoint in socket.getaddrinfo(a, None, socket.AF_UNSPEC, socket.SOCK_STREAM)]
socket.gaierror: [Errno -2] Name does not resolve
解决方法
方法1:直接在Cassandra容器内执行cqlsh(最稳定)
无需跨容器DNS解析,直接进入容器使用自带的cqlsh工具:
docker exec -it cassandra cqlsh
方法2:使用容器IP替代主机名连接
- 获取Cassandra容器的IP地址:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' cassandra
- 将命令中的
cassandra主机名替换为上述IP:
docker run --rm -it --network cassandra nuvo/docker-cqlsh cqlsh <获取到的容器IP> 9042 --cqlversion='3.4.5'
方法3:等待Cassandra服务完全就绪
Cassandra启动需要加载数据和初始化服务,刚启动容器时服务未就绪可能导致DNS解析异常。执行以下命令确认服务状态:
docker exec -it cassandra nodetool status
当输出显示节点状态为UN(Up/Normal)时,再执行原连接命令即可。
内容的提问来源于stack exchange,提问作者gustavomr

