Приложение на spring boot не может соединиться с mysql внутри docker-compose

Мне надо запустить свое приложение на спринг буте с базой mysql вместе при помощи docker-compose. Почему при такой конфигурации сервисов приложение (app) не может подключиться к mysql (db)?

Dockerfile:

FROM openjdk:23-slim
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

docker-compose.yml:

version: "3"

services:
  db:
    image: mysql:5.7
    restart: unless-stopped
    environment:
      - MYSQL_ROOT_PASSWORD=123
      - MYSQL_DATABASE=catalogue
    ports:
      - "3306:3306"
    expose:
      - 3306
    volumes:
      - db:/var/lib/mysql
    networks:
      - net

  app:
    depends_on:
      - db
    build:
      context: .
      dockerfile: Dockerfile
    restart: on-failure
    ports:
      - "8080:8080"
    networks:
      - net

volumes:
  db:

networks:
  net:
    driver: bridge

Конфиг приложения на джаве:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/catalogue
    username: root
    password: 123
    driver-class-name=com: com.mysql.jdbc.Driver
  jpa:
    hibernate:
      ddl-auto: update
    database-platform: org.hibernate.dialect.MySQL8Dialect
    defer-datasource-initialization: true
  sql:
    init:
      mode: always

Ошибка такая: The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.


Ответы (1 шт):

Автор решения: Deniska SosiSka

Вы пытайтесь подключится из сервиса в бд через localhost, но это не возможно так-как каждый контейнер предоставляет изолированную среду, вы можете подключится к их портам так-как осуществили мапинг их портов на Ваш localhost. Но внутри у каждого контейнера localhost свой и там нет таких сопоставлений. Docker Compose самостоятельное создаёт адресное пространство для контейнеров, по умолчанию адрес каждого контейнера соответствует его имени. Вам нужно заменить в сервисе url: jdbc:mysql://localhost:3306/catalogue на url: jdbc:mysql://db:3306/catalogue

→ Ссылка