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

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

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

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

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.

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

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" />

Ainda retorna o mesmo erro!

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.