Spring Boot和Redis容器之间的通信

时间:2017-09-09 21:43:26

标签: docker spring-boot redis

我使用基于Spring Boot框架的REST API实现了简单的独立webapp。我的应用程序使用Redis缓存一些数据。现在我想将webapp和Redis缓存停靠,以提供简单的运行过程,而无需在工作环境中强制安装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>

搬运工-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运行app,并在每次Sprin Boot应用程序调用Redis时获得上面列出的异常。可以从主机访问Redis缓存。没有Docker,安装Redis服务时一切正常。

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

2 个答案:

答案 0 :(得分:2)

尝试创建一个泊坞网络并将容器附加到此网络:

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

答案 1 :(得分:0)

最后我认识到了这个问题。我使用sudo docker-compose up命令启动应用程序,如上所述。此命令重新运行先前启动的容器(不是每次都重建图像),因此我未提及所提供的所有更改。我认为项目代码会被重新编译。

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