Проект Spring Boot Dockerize и контейнер redis получают java.net.ConnectException: соединение отклонено (соединение отклонено) - PullRequest
0 голосов
/ 04 ноября 2019

Я работаю с загрузочным приложением Dockerize и перенаправляю в другой контейнер. Я запускаю контейнер redis следующим образом: docker run -d --name redis -p 6379:6379 redis

Когда я запускаю свое приложение с идентификатором, у меня нет проблем, и мое приложение может подключиться к redis.

Но когдаЯ запускаю свое приложение как контейнер: docker run -p 8080: 8080 Shorttenurl, я получаю следующую проблему: java.net.ConnectException: Connection refused (Connection refused).

Это мой pom.xml:

<groupId>com.neueda.shorturl</groupId>
    <artifactId>shortenurl</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>shortenurl</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
        <finalName>shortenurl</finalName>
    </build>

А это моя конфигурация application.yml:

spring:
  application:
    name: shortenurl-neueda-assignment
  redis:
    host: localhost
    port: 6379

Есть идеи?

Спасибо.

1 Ответ

1 голос
/ 04 ноября 2019

Это потому, что когда вы запускаете свои приложения в двух разных контейнерах, они больше не находятся в одной сети. Вы не можете получить доступ к localhost или любому IP с обратной связью, если вы не находитесь в контейнере. Внутри контейнера только localhost. Но вы можете получить доступ к контейнерам по их имени, если оба контейнера находятся в одной сети.

Следовательно, вы должны организовать сеть докеров и развернуть оба контейнера в этой сети, а затем каждый другой контейнер, способный разрешать хосты по их имени контейнера.

Попробуйте это;

$ docker network create test-netw
$ docker run --net test-netw -d --name redis -p 6379:6379 redis

И изменить хост Redis в файле aplication.yml;

spring:
  redis:
    host: redis
    port: 6379
    jedis:
      pool:
        max-active: 7
        max-idle: 7
        min-idle: 2

Добавить эту конфигурацию, а также

@Bean
JedisPool jedisPool(RedisProperties redisProperties) {
    return new JedisPool(new JedisPoolConfig(), redisProperties.getHost(), redisProperties.getPort());
}

И вместо использования;

Jedis jedis = new Jedis();

Используйте это;

Jedis jedis = pool.getResource();

И последний шаг:

$ docker run -p 8080:8080 --net test-netw shortenurl
...