Problema de conexão entre aplicação Java e PostgreSQL ao usar Docker

7 respostas
java
Carlos_Henrique5

Estou tentando dockerizar minha aplicação Java, que utiliza o Tomcat, e estou enfrentando dificuldades para estabelecer a conexão com o banco de dados PostgreSQL. Já criei um docker-compose.yml para configurar os contêineres do Tomcat e do PostgreSQL, mas a aplicação não consegue se conectar ao banco de dados. Alguém saberia informar se fiz algo de errado?

Dockerfile

FROM maven:3.3.9-jdk-8 AS build

WORKDIR /opt/app

COPY pom.xml .

RUN mvn -B dependency:resolve-plugins dependency:resolve -Dhttps.protocols=TLSv1.2

COPY src ./src

RUN mvn package -DskipTests -Dhttps.protocols=TLSv1.2

FROM tomcat:9.0-jre8-alpine

RUN rm -r /usr/local/tomcat/webapps && \
    apk --no-cache add fontconfig ttf-dejavu tzdata

COPY --from=build /opt/app/target/*.war /usr/local/tomcat/webapps/ROOT.war

CMD ["catalina.sh", "run"]

docker-compose.yml

version: '3.8'
services:
  premiocar:
    build: .
    ports:
      - 8888:8080
    environment:
      - DATABASE_URL=jdbc:postgresql://db/bd_premiocar
      - DATABASE_USERNAME=postgres
      - DATABASE_PASSWORD=postgres
      - TZ=America/Recife
    depends_on:
      - db
    networks:
      - network

  db:
    image: postgres:15.3
    volumes:
      - /var/lib/postgresql/data
    environment:
      - POSTGRES_DB=bd_premiocar
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    networks:
     - network

networks:
  network:

Erro

premiocar-locadoradeveiculos-premiocar-1  |     Caused by: org.postgresql.util.PSQLException: Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.
premiocar-locadoradeveiculos-premiocar-1  |             at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:342)
premiocar-locadoradeveiculos-premiocar-1  |             at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:54)
premiocar-locadoradeveiculos-premiocar-1  |             at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:253)
premiocar-locadoradeveiculos-premiocar-1  |             at org.postgresql.Driver.makeConnection(Driver.java:434)
premiocar-locadoradeveiculos-premiocar-1  |             at org.postgresql.Driver.connect(Driver.java:291)
premiocar-locadoradeveiculos-premiocar-1  |             at org.hibernate.engine.jdbc.connections.internal.DriverConnectionCreator.makeConnection(DriverConnectionCreator.java:38)
premiocar-locadoradeveiculos-premiocar-1  |             ... 116 more
premiocar-locadoradeveiculos-premiocar-1  |     Caused by: java.net.ConnectException: Connection refused (Connection refused)
premiocar-locadoradeveiculos-premiocar-1  |             at java.net.PlainSocketImpl.socketConnect(Native Method)
premiocar-locadoradeveiculos-premiocar-1  |             at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
premiocar-locadoradeveiculos-premiocar-1  |             at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
premiocar-locadoradeveiculos-premiocar-1  |             at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
premiocar-locadoradeveiculos-premiocar-1  |             at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
premiocar-locadoradeveiculos-premiocar-1  |             at java.net.Socket.connect(Socket.java:589)
premiocar-locadoradeveiculos-premiocar-1  |             at org.postgresql.core.PGStream.createSocket(PGStream.java:243)
premiocar-locadoradeveiculos-premiocar-1  |             at org.postgresql.core.PGStream.<init>(PGStream.java:98)
premiocar-locadoradeveiculos-premiocar-1  |             at org.postgresql.core.v3.ConnectionFactoryImpl.tryConnect(ConnectionFactoryImpl.java:132)
premiocar-locadoradeveiculos-premiocar-1  |             at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:258)
premiocar-locadoradeveiculos-premiocar-1  |             ... 121 more

7 Respostas

Lucas_Camara

Acredito que o erro seja por conta da falta da porta na url de conexão

Tente:

environment:
      - DATABASE_URL=jdbc:postgresql://db:5432/bd_premiocar
Carlos_Henrique5

Testei essa abordagem, mas infelizmente não funcionou; o mesmo erro continua ocorrendo.

Lucas_Camara

Como está o código da aplicação? No log, ele está tentando conectar em localhost:5432, e como vc está usando uma network específica, talvez seja a causa do problema.

Carlos_Henrique5

Para que você possa analisar melhor, eu subi o projeto no GitHub. Ficarei grato se puder dar uma olhada: GitHub - c-henrique-dev/premiocar-jsf

Lucas_Camara

Faça um teste, alterando a url de conexão no persistence.xml. Deixe assim:

<property name="javax.persistence.jdbc.url" value="jdbc:postgresql://db:5432/bd_premiocar" />
Carlos_Henrique5

Ainda retorna o mesmo erro!

Lucas_Camara

Remova a definição de networks do yaml, volte para localhost no persistence.xml e tente de novo.

Isso pq a rede padrão usada será a bridge, ou seja, será acessível diretamente pela mesma rede que o host (seu pc) usa. Ao criar de forma explícita uma network, se não me engano, ele funciona de forma isolada. Por isso pedi para trocar lah no persistence.xml para ver se funcionaria.

Criado 19 de julho de 2023
Ultima resposta 20 de jul. de 2023
Respostas 7
Participantes 2