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