Spring Boot应用连接Docker内Cassandra时出现连接异常
Spring Boot连接Docker中Cassandra的连接问题解决
问题概述
启动Spring Boot应用时,无法连接到Docker容器内运行的Cassandra,抛出UnknownHostException,提示无法解析主机名"cassandra"。
相关配置
application.properties配置
spring.data.cassandra.local-datacenter=datacenter1 spring.data.cassandra.keyspace-name=oboe spring.data.cassandra.contact-points=cassandra spring.data.cassandra.port=9042 spring.data.cassandra.username=cassandra spring.data.cassandra.password=cassandra spring.data.cassandra.schema-action=create_if_not_exists spring.data.cassandra.entity-base-package=com.example.cassandra.connectivity
错误日志
Spring应用启动错误日志
2022-10-06 23:55:34.844 WARN 3284 --- [ s0-admin-1] c.d.o.d.i.c.control.ControlConnection : [s0] 连接节点失败(endPoint=cassandra/<unresolved>:9042, hostId=null, hashCode=68e4631),尝试下一个节点 (UnknownHostException: 未知主机:cassandra) 2022-10-06 23:55:36.980 WARN 3284 --- [ main] ConfigServletWebServerApplicationContext : 上下文初始化时遇到异常 - 取消刷新尝试: org.springframework.beans.factory.UnsatisfiedDependencyException: 创建名为'scanLocationDataController'的Bean失败: 字段'service'存在未满足的依赖;嵌套异常为org.springframework.beans.factory.UnsatisfiedDependencyException: 创建名为'scanLocationDataService'的Bean失败: 字段'repo'存在未满足的依赖;嵌套异常为org.springframework.beans.factory.BeanCreationException: 创建在@EnableCassandraRepositories(声明于CassandraRepositoriesRegistrar.EnableCassandraRepositoriesConfiguration)中定义的org.gcs.cassandra.repo.ScanLocationDataRepo'scanLocationDataRepo'失败: 设置Bean属性'cassandraTemplate'时无法解析对Bean'cassandraTemplate'的引用;嵌套异常为org.springframework.beans.factory.BeanCreationException: 创建类路径资源[org/gcs/cassandra/config/CassandraConfig.class]中定义的'cassandraTemplate'失败: 通过工厂方法实例化Bean失败;嵌套异常为org.springframework.beans.BeanInstantiationException: 无法实例化[org.springframework.data.cassandra.core.CassandraAdminTemplate]: 工厂方法'cassandraTemplate'抛出异常;嵌套异常为org.springframework.beans.factory.UnsatisfiedDependencyException: 创建类路径资源[org/gcs/cassandra/config/CassandraConfig.class]中定义的'cassandraSessionFactory'失败: 方法'cassandraSessionFactory'参数0存在未满足的依赖;嵌套异常为org.springframework.beans.factory.BeanCreationException: 创建类路径资源[org/gcs/cassandra/config/CassandraConfig.class]中定义的'cassandraSession'失败: 调用初始化方法失败;嵌套异常为com.datastax.oss.driver.api.core.AllNodesFailedException: 无法连接到任何接触点,请确保提供了有效地址(显示前1个节点,使用getAllErrors()查看更多): Node(endPoint=cassandra/<unresolved>:9042, hostId=null, hashCode=68e4631): [java.net.UnknownHostException: 未知主机:cassandra]
Docker容器日志
cassandra 21:35:51.97 INFO ==> ** 开始Cassandra初始化 ** cassandra 21:35:51.98 WARN ==> 未设置CASSANDRA_HOST,默认使用系统主机名 cassandra 21:35:51.98 INFO ==> 验证CASSANDRA_*环境变量中的设置.. cassandra 21:35:51.99 WARN ==> 未提供密码,将使用默认密码"cassandra"。出于安全考虑,请在生产环境中使用安全密码。 cassandra 21:35:51.99 WARN ==> 您设置了环境变量CASSANDRA_PASSWORD=cassandra。这是Cassandra初始化时的默认值,不应在生产环境中使用。 cassandra 21:35:52.01 INFO ==> 初始化Cassandra数据库... cassandra 21:35:52.21 INFO ==> 从零开始部署Cassandra cassandra 21:35:52.22 INFO ==> 启动Cassandra cassandra 21:35:52.22 INFO ==> 检查启动是否正常 cassandra 21:36:57.30 INFO ==> 找到CQL启动日志行 cassandra 21:36:58.74 INFO ==> Nodetool报告Cassandra启动成功 cassandra 21:36:58.75 INFO ==> 非种子节点,等待同步 cassandra 21:36:58.75 INFO ==> 尝试访问CQL服务器 @ ccff4fe7e189 cassandra 21:37:11.24 INFO ==> 成功访问CQL服务器 cassandra 21:37:11.25 INFO ==> ** Cassandra初始化完成! **
解决方案
1. 解决主机名解析问题
错误核心是Spring应用无法解析"cassandra"这个主机名,分两种场景处理:
- Spring应用本地运行(非容器化):
- 修改本地
hosts文件(Windows路径:C:\Windows\System32\drivers\etc\hosts;Linux/macOS路径:/etc/hosts),添加一行:127.0.0.1 cassandra,让本地系统将"cassandra"映射到localhost。 - 或者修改
application.properties中的spring.data.cassandra.contact-points为localhost,前提是启动Cassandra容器时已经将9042端口映射到主机(启动命令类似docker run -p 9042:9042 cassandra)。
- 修改本地
- Spring应用也是容器化部署:
- 创建并使用同一个Docker网络:
- 创建网络:
docker network create cassandra-network - 启动Cassandra容器时加入该网络:
docker run --name cassandra --network cassandra-network -d cassandra - 启动Spring应用容器时加入同一网络:
docker run --name spring-app --network cassandra-network -d your-spring-image
这样容器间可以通过容器名互相解析。
- 创建网络:
- 创建并使用同一个Docker网络:
2. 验证网络连通性
- 本地运行时,用
telnet localhost 9042或nc -zv localhost 9042测试端口是否可达。 - 容器化场景下,进入Spring应用容器,执行
ping cassandra验证主机名是否能解析,再用telnet cassandra 9042测试端口连通性。
3. 确认Cassandra配置
从容器日志看,Cassandra已经正常启动并完成初始化,无需调整Cassandra本身的配置,确保用户名密码与application.properties中的配置一致即可。
内容的提问来源于stack exchange,提问作者user20179738
相关产品推荐
相关产品推荐

