docker与springboot和redis组合

docker与springboot和redis组合,docker,docker-compose,Docker,Docker Compose,我正在尝试使用docker compose将一个简单的springboot应用程序与redis连接起来。然而,我不断得到下面的错误 java-service_1 | 2020-11-20 10:30:54.053 ERROR 1 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with

我正在尝试使用
docker compose
将一个简单的
springboot
应用程序与
redis
连接起来。然而,我不断得到下面的错误

    java-service_1  | 2020-11-20 10:30:54.053 ERROR 1 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool] with root cause
java-service_1  | 
java-service_1  | java.net.ConnectException: Connection refused (Connection refused)
java-service_1  |       at java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:1.8.0_252]
java-service_1  |       at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_252]
java-service_1  |       at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_252]
java-service_1  |       at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[na:1.8.0_252]
java-service_1  |       at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_252]
java-service_1  |       at java.net.Socket.connect(Socket.java:607) ~[na:1.8.0_252]
java-service_1  |       at redis.clients.jedis.DefaultJedisSocketFactory.createSocket(DefaultJedisSocketFactory.java:53) ~[jedis-3.3.0.jar!/:na]
java-service_1  |       at redis.clients.jedis.Connection.connect(Connection.java:158) ~[jedis-3.3.0.jar!/:na]
java-service_1  |       at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:109) ~[jedis-3.3.0.jar!/:na]
配置
@Bean
公共重新统计配置重新统计配置(){
System.out.println(“与redis连接”);
重新标准配置重新标准配置=新的重新标准配置(“redis”,6379);
返回重新标准配置;
}
@豆子
公共ClientOptions ClientOptions(){
return ClientOptions.builder()
.disconnectedBehavior(ClientOptions.disconnectedBehavior.REJECT_命令)
.autoReconnect(真)
.build();
}
@豆子
公共重新连接工厂连接工厂(重新标准配置重新标准配置){
LettuceClientConfiguration=LettuceClientConfiguration.builder()
.clientOptions(clientOptions()).build();
返回新的LettuceConnectionFactory(重新标准配置、配置);
}
@豆子
@ConditionalOnMissingBean(name=“redisTemplate”)
@初级的
公共RedisTemplate RedisTemplate(RedisConnectionFactory RedisConnectionFactory){
StringRedisTemplate=新建StringRedisTemplate();
模板.setConnectionFactory(RedConnectionFactory);
返回模板;
}
docker-compose.yml 版本:“3” 服务: redis服务器: 容器名称:redis 图片:“redis” 端口: - "6379:6379" java服务: 生成:。 链接: -redis服务器 端口:
-“8080:8080”

我认为出现问题是因为您的应用程序无法连接到数据库,因为

RedisStandaloneConfiguration redisStandaloneConfiguration 
                                    = new RedisStandaloneConfiguration("redis", 6379);
现在,您使用了
redis
作为主机名,这是不正确的。您应该使用容器名称作为主机,并确保两个容器位于同一网络上

要使其正常工作,您可以执行以下操作:

docker compose.yml

version: '3'
services:
  redis-server:
    container_name: redis
    image: 'redis'
    ports:
      - "6379:6379"
  java-service:
    build: .
    links:
      - redis-server
    ports:
      - "8080:8080"
version: '3'
services:
  redis-server:
    hostname: redis
    image: 'redis'
    ports:
      - "6379:6379"
  java-service:
    build: .
    links:
      - redis-server
    ports:
      - "8080:8080"
现在,同一网络上的其他容器将能够使用
redis
作为主机名与redis通信

如果不想设置修复容器名称,请使用hostname属性,如:

docker compose.yml

version: '3'
services:
  redis-server:
    container_name: redis
    image: 'redis'
    ports:
      - "6379:6379"
  java-service:
    build: .
    links:
      - redis-server
    ports:
      - "8080:8080"
version: '3'
services:
  redis-server:
    hostname: redis
    image: 'redis'
    ports:
      - "6379:6379"
  java-service:
    build: .
    links:
      - redis-server
    ports:
      - "8080:8080"
我希望这能解决你的问题,如果没有,请在这里添加你的日志,我会尽力帮助你


祝你好运,学习愉快

我仍然得到同样的回答。编辑了带有完整错误的问题,并修改了配置。@user3310115您可以检查redis是否正常启动和运行,即您可以将redis客户端连接到您的redis服务器吗?是的,我可以访问redis cli。@user3310115确定。尝试单独启动服务,但以附加模式启动,然后检查日志是否存在故障或错误。一旦你找到了,就把它们贴在这里。事实上,这是一个愚蠢的错误。我没有重建我的springboot jar。我的初始配置本身就起作用了。在我完成mvn干净安装后,docker用正确的服务器名复制了新的jar,它工作得很好。