You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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网络:
      1. 创建网络:docker network create cassandra-network
      2. 启动Cassandra容器时加入该网络:docker run --name cassandra --network cassandra-network -d cassandra
      3. 启动Spring应用容器时加入同一网络:docker run --name spring-app --network cassandra-network -d your-spring-image
        这样容器间可以通过容器名互相解析。

2. 验证网络连通性

  • 本地运行时,用telnet localhost 9042或nc -zv localhost 9042测试端口是否可达。
  • 容器化场景下,进入Spring应用容器,执行ping cassandra验证主机名是否能解析,再用telnet cassandra 9042测试端口连通性。

3. 确认Cassandra配置

从容器日志看,Cassandra已经正常启动并完成初始化,无需调整Cassandra本身的配置,确保用户名密码与application.properties中的配置一致即可。

内容的提问来源于stack exchange,提问作者user20179738

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 15:15:44