Docker: контейнеру Springboot не удается подключиться к PostgreSql Ошибка подключения к контейнеру - PullRequest
0 голосов
/ 22 ноября 2018

Я создаю свое первое приложение Springboot 2.0.Я пытаюсь поместить мое приложение Springboot в один контейнер докеров, а мой PostgresDB - в другой контейнер.

Мой Dockerfile

    FROM frolvlad/alpine-oraclejdk8:slim
    VOLUME /tmp
    ADD springboot-api-demo-0.1*.jar app.jar
    RUN sh -c 'touch /app.jar'
    EXPOSE 9443
    ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/urandom -jar /app.jar" ]

Мой файл docker-compose.yml

version: "2.1"

services:
  springboot-api-demo:
    image: "fw/springboot-api-demo"
    mem_limit: 1024m
    ports:
      - "8080:8080"
    environment:
      - SPRING_PROFILES_ACTIVE=local
      - AWS_REGION=local
      - ENVIRONMENT=local
      - AUTH_ENABLED=false
  postgres:
    container_name: pgdb
    image: postgres:9.6-alpine
    environment:
    - 'POSTGRES_ROOT_PASSWORD=postgres'
    - 'POSTGRES_USER=postgres'
    - 'POSTGRES_PASSWORD=postgres'
    ports:
    - "54321:5432"

Я использую Springboot JPAДанные 2.0 с данными конфигурации ниже в моем application.properties

spring.datasource.url= jdbc:postgresql://localhost:54321/java_learning
spring.datasource.username=postgres
spring.datasource.password=postgres

Я могу проверить, что оба изображения работают.Кроме того, из журнала Docker и событий Docker я вижу, что Postgres Container работает нормально, даже я могу получить к нему доступ, а также создал БД.Но контейнер Springboot запустился, но я умер, потому что он не мог подключиться к postgress и выбрасывать ошибку ниже.

Невозможно получить соединение из базы данных: попытка соединения не удалась

Обратите внимание, что на моем хост-компьютере уже есть Postgres на порту 5432, поэтому я сделал отображение порта 54321:5432 на моем контейнере postgres.Вот доказательство :) -

➜  springboot-api-demo git:(master) ✗ lsof -i:54321              
COMMAND     PID             USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
com.docke 44345 shailendra.singh   18u  IPv4 0xf62897fbdd69e31d      0t0  TCP *:54321 (LISTEN)
com.docke 44345 shailendra.singh   21u  IPv6 0xf62897fbdd119975      0t0  TCP localhost:54321 (LISTEN)

➜  springboot-api-demo git:(master) ✗ lsof -i:5432 
COMMAND  PID             USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
postgres 715 shailendra.singh    5u  IPv6 0xf62897fbb43e03b5      0t0  TCP localhost:postgresql (LISTEN)
postgres 715 shailendra.singh    6u  IPv4 0xf62897fbbaeea9bd      0t0  TCP localhost:postgresql (LISTEN)

Я не уверен, в чем проблема.Но мое приложение Springboot не может подключить мой контейнер postgres, который работает нормально, с надлежащими учетными данными.

Ответы [ 3 ]

0 голосов
/ 22 ноября 2018

Вы указываете свое приложение на localhost, но оно не разделяется между контейнерами.

Чтобы получить доступ к другому контейнеру, вы должны обратиться к его hostname.

, который следует использовать.следующий datasource url:

spring.datasource.url=jdbc:postgresql://pgdb:5432/java_learning

См. это простое руководство по подключению к контейнеру из другого контейнера с помощью docker compose: https://docs.docker.com/compose/gettingstarted/

0 голосов
/ 12 декабря 2018

В вашей спецификации docker-compose.yml отсутствует сетевая конфигурация.Используя «сети», вы можете эффективно взаимодействовать между контейнерами по их имени службы (используя dns, имя службы в качестве имени хоста).

Вот обновленное docker-compose.yml:

version: "2.1"

services:
  springboot-api-demo:
    image: "fw/springboot-api-demo"
    mem_limit: 1024m
    ports:
      - "8080:8080"
    environment:
      - SPRING_PROFILES_ACTIVE=local
      - AWS_REGION=local
      - ENVIRONMENT=local
      - AUTH_ENABLED=false
    networks:
      - mynet

  postgres:
    container_name: pgdb
    image: postgres:9.6-alpine
    environment:
    - 'POSTGRES_ROOT_PASSWORD=postgres'
    - 'POSTGRES_USER=postgres'
    - 'POSTGRES_PASSWORD=postgres'
    ports:
    - "54321:5432"
    networks:
    - mynet

networks:
  mynet:
    driver: bridge

URL вашей базы данных должен выглядеть следующим образом: spring.datasource.url=jdbc:postgresql://postgres:5432/java_learning (обратите внимание, что имя хоста postgres равно имени службы.

0 голосов
/ 22 ноября 2018

Попробуйте с помощью:

spring.datasource.url= jdbc:postgresql://pgdb:5432/java_learning

База данных postgres не работает на локальном хосте, она работает в другом контейнере с другим IP-адресом (пока неизвестным).

К счастью, docker-compose автоматически создает сеть, совместно используемую всеми контейнерами в docker-compose.yml (если явно не указано иное), в результате вы можете волшебным образом использовать имя службы какимя хоста .

Также у вас есть опечатка в порту, Postgres по умолчанию использует 5432, а не 54321

...