Spring Boot 和 Redis 容器之间的通信

Posted

技术标签:

【中文标题】Spring Boot 和 Redis 容器之间的通信【英文标题】:Communication between Spring Boot and Redis containers 【发布时间】:2018-02-18 11:53:30 【问题描述】:

我使用基于 Spring Boot 框架的 REST API 实现了简单、独立的 webapp。我的应用程序正在使用 Redis 缓存一些数据。现在我想对 webapp 和 Redis 缓存进行 dockerize 以提供简单的运行过程,而无需在工作环境中强制安装 Redis。

我尝试了很多方法,但我仍然与RedisConnectionFailureException: Cannot get Jedis connection 和根本原因ConnectException: Connection refused 斗争。

pom.xml:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.6.RELEASE</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
        <plugin>
            <groupId>com.spotify</groupId>
            <artifactId>dockerfile-maven-plugin</artifactId>
            <version>1.3.5</version>
            <configuration>
                <repository>$project.artifactId</repository>
            </configuration>
        </plugin>
    </plugins>
</build>

docker-compose.yml:

version: '3'
services:
  web:
    build: .
    ports:
     - "8080:8080"
    links:
     - redis
  redis:
    image: redis
    ports:
      - "6379:6379"

Dockerfile:

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD target/xxx.jar abc.jar
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS - Djava.security.egd=file:/dev/./urandom -jar /abc.jar" ]

application.properties:

spring.redis.host=redis
spring.redis.port=6379

我通过构造函数自动装配StringRedisTemplate,从模板中获取ValueOperations并简单地使用它(无需额外的Redis配置)。我使用命令 sudo docker-compose up 运行应用程序,并在每次 Sprin Boot 应用程序调用 Redis 时得到上面列出的异常。 Redis 缓存可从主机访问。没有 Docker 并且安装了 Redis 服务后一切正常。

更新:我正在使用我之前粘贴的 application.properties 和 application.yml,我在其中存储了一些与我的应用程序逻辑相关的自定义配置(不是框架配置)。我读到这应该不是问题,因为 Spring Boot 会加载这两个文件并将它们合并。我怀疑 Redis 主机在 Jedis 连接中设置不正确,但我不知道如何检查它。

【问题讨论】:

【参考方案1】:

尝试创建一个 docker 网络并将容器附加到该网络:

docker network create spring

version: '3'
  services:
    web:
      build: .
      ports:
       - "8080:8080"
      networks:
       - spring
    redis:
      image: redis
      command: [ "redis-server", "--protected-mode", "no" ]
      ports:
        - "6379:6379"
      networks:
        - spring
  networks:
    spring:
      external: true

【讨论】:

感谢您的回答,但我得到了完全相同的异常。 @Geeky 更新了 docker-compose 文件。显然,默认情况下启用了一种安全模式。检查保护模式部分redis.io/topics/security 不幸的是它没有解决问题,抛出同样的异常。 请注意结尾处的networks 缩进错误(尝试编辑但无法编辑)。它应该在根级别。【参考方案2】:

我终于意识到了这个问题。如问题所述,我使用sudo docker-compose up 命令启动应用程序。此命令重新运行以前启动的容器(不会每次都重建映像),因此我提供的所有更改都没有考虑在内。我以为项目代码会被重新编译。

以上配置对我来说很好用。只需运行sudo docker-compose down &amp;&amp; mvn clean install,然后运行sudo docker-compose up

【讨论】:

请注意,将 docker/docker-compose 与 sudo 一起使用是一种不好的做法,您应该将其配置为与普通用户一起使用

以上是关于Spring Boot 和 Redis 容器之间的通信的主要内容,如果未能解决你的问题,请参考以下文章

无法从 docker 容器内的 Spring Boot 连接到 Redis

如何将我的 Spring Boot 应用程序连接到 Docker 上的 Redis 容器?

如何使用 spring boot 和 spock 运行测试容器

Docker Compose (TOMCAT + POSTGRES) - Spring Boot 应用程序:容器之间的连接问题

spring boot 使用redis进行发布订阅

Angular 应用程序和部署在 Docker 容器中的 Spring Boot API 之间的通信问题