Невозможно подключиться к серверу MySQL Docker из приложения Spring Boot

Сейчас я пробую несколько новых вещей и хотел создать небольшое приложение Spring/mySQL. Я настроил файл docker-compose следующим образом:

version: '3.3'
services:
  docker-mysql:
    container_name: docker-mysql
    image: mysql:5.7
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=root
    volumes:
      - db_data:/var/lib/mysql
      - ./initalize.sql:/docker-entrypoint-initdb.d/initalize.sql:ro
    ports:
      - 3306:3306
    expose:
      - 3306
volumes:
  db_data: {}

В initalize.sql я создал базовую базу данных TEST с несколькими тестовыми таблицами и заполнил некоторые из них, все работает нормально, я мог запрашивать элементы через командную строку.

С другой стороны, я не могу подключиться к нему через Spring, у меня есть следующий файл application.properties:

spring.jpa.hibernate.ddl-auto=none
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
spring.datasource.url=jdbc:mysql://localhost:3306/TEST?useSSL=false
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

Каждый раз, когда я пытаюсь запустить приложение, оно получает (я не запускаю приложение в образе докера, оно работает в Windows) com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure error, and it can't find the server.

Я также пытался подключиться, чтобы изменить URL-адрес источника данных на jdbc:mysql://docker-mysql:3306/TEST?useSSL=false, но это тоже не сработало.

Если приложение Spring-Boot также работает в контейнере, оно должно работать в той же виртуальной сети, что и база данных MySQL, а приложение Spring-Boot должно использовать docker-mysql в качестве имени хоста для базы данных.

Turing85 05.05.2024 12:53
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
72
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если вы хотите, чтобы это работало:

Я также попытался подключиться, чтобы изменить URL-адрес источника данных на jdbc:mysql://docker-mysql:3306/TEST?useSSL=false, но это тоже не сработало.

Ваше приложение Spring Boot должно работать как док-контейнер в той же виртуальной сети, что и ваш док-контейнер MySQL, или оба контейнера должны работать в мостовой сети по умолчанию, предоставляемой Docker.

Ответ принят как подходящий

То, что вы собираетесь сделать, будет работать только в том случае, если вы разрешите маршрутизацию доступа к вашему хосту:порту в контейнер mariadb. Вам придется не только открыть порт, но и разместить его в хост-сети. См. https://docs.docker.com/network/drivers/host/ Обратите внимание, что в этой настройке вы по-прежнему не сможете получить доступ к локальному хосту:порту, а к имени хоста:порту.

Другая возможность — поместить клиентское приложение в другой докер-контейнер в той же сети. См. https://docs.docker.com/network/

Другие вопросы по теме