#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 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 и избегание ручного создания мостовых сетей для разрешения имен. Для производственной среды это было бы идеально.