Spring-boot не удается подключиться к контейнеру mysql даже после указания правильного имени службы mysql

#mysql #spring-boot #docker

#mysql #spring-boot #docker

Вопрос:

Это может показаться повторяющимся вопросом, но это не так, и я чувствую, что это сумасшедшая ошибка, однако позвольте мне быстро объяснить мою настройку:

Простое приложение начальной загрузки Spring, которое довольно хорошо работает с моей локальной и JDBC-строкой подключения в application.properites файле, выглядит следующим образом.

 spring.datasource.url=jdbc:mysql://minesql:3306/datamachine?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=****
  

Запущенные экземпляры docker:
введите описание изображения здесь

Я скопировал (с помощью docker cp команды) файл war в alpine (контейнер unix) и запустил его в интерактивном режиме для тестирования, и он выдает исключение, поскольку не может выполнить пинг сервера mysql. Я уверен, что конфигурации базы данных в порядке и не понимаю, почему приложению springboot не удается подключиться к экземпляру контейнера mysql. Обратите внимание, что в контейнере mysql есть база данных «datamachine», созданная вручную.

Сообщается об ошибке: введите описание изображения здесь

Пожалуйста, помогите мне понять, чего мне здесь не хватает или что происходит не так.

На всякий случай, если вы хотите знать, как я запустил эти контейнеры.

Для mysql:

 docker run -d --name minesql -e MYSQL_ROOT_PASSWORD=**** -p 3306:3306 mysql 
  

Запуск Java-приложения из контейнера alpine, и вот как я запускаю alpine,

 docker run -it --name unix alpine
  

Интерактивный режим выдает мне bash приглашение для запуска файла войны при загрузке spring. (.. и запуск файла войны после установки java 8 в alpine)

Комментарии:

1. Как вы запускаете контейнеры?

2. @Wander3r Спасибо за прочтение. Пожалуйста, найдите обновленный вопрос, чтобы ответить на ваш конкретный запрос.

Ответ №1:

У вас есть два контейнера docker, которые запущены и подключены через мостовую сеть по умолчанию. Из документации docker bridge

Контейнеры в мостовой сети по умолчанию могут обращаться друг к другу только по IP-адресам, если вы не используете опцию —link, которая считается устаревшей. В пользовательской мостовой сети контейнеры могут разрешать друг друга по имени или псевдониму.

Если вам нужно, чтобы второй контейнер мог разрешать имя minesql изнутри, вам необходимо создать определяемый пользователем сетевой мост и подключить к нему контейнеры docker container.

Создайте новую сеть, используя

 docker network create my-net
  

И добавьте свои контейнеры, как указано здесь

Другой альтернативой является использование docker-compose и избегание ручного создания мостовых сетей для разрешения имен. Для производственной среды это было бы идеально.