将 Spring 引导和 redis 与 docker-compose 组合:连接被拒绝

Combining Spring boot and redis with docker-compose: Connection refused

我正在尝试使用 spring 启动和 MongoDB 和 redis 来做一个基本的 docker 容器。 Mongo 很好,但无法在 redis 和 spring 引导之间建立连接,尽管配置对我来说没问题。

docker-compose.yml

version: "3.9"
services:
  web:
    build: .
    ports:
      - "1234:1234"
    depends_on:
      - redis
      - db
  db:
    image: mongo
    hostname: mongodb
    ports:
      - "27017:27017"
  redis:
    hostname: redis
    image: redis
    restart: always
    ports:
      - "6379:6379"

Dockerfile:

FROM adoptopenjdk:11
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

Config.java:

@Configuration
@EnableRedisRepositories
public class Config
{

    RedisStandaloneConfiguration standaloneConfiguration() {
        return new RedisStandaloneConfiguration("redis", 6379);
    }

    @Bean
    JedisConnectionFactory jedisConnectionFactory() {
        return new JedisConnectionFactory(standaloneConfiguration());
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(jedisConnectionFactory());
        return template;
    }
}

问题:所有容器在docker组合后都是运行。但是spring和redis无法建立连接

java.net.ConnectException: Connection refused (Connection refused)
slot-web-1    |     at java.base/java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:na]
slot-web-1    |     at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399) ~[na:na]
slot-web-1    |     at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242) ~[na:na]
slot-web-1    |     at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224) ~[na:na]
slot-web-1    |     at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:na]

首先,如果你的容器在远程服务器上,你可以在部署容器的服务器上使用telnet测试是否可以连接到redis的6379端口。如果是,可以查看服务器是否开放了6379端口,或者白名单。 其次,可以尝试在电脑上telnet连接容器redis的6379端口。 如果是,你可以检查你的redis配置的ip、密码、用户名等信息是否正确

如果您的 Redis 服务器启动晚于 spring 启动,则可能会发生此错误。确保首先通过以下命令启动redis。

docker compose down && docker compose up -d redis && sleep 5 && docker compose up --build -d