Как подключить spring-boot и mysql с помощью докера?

Я попытался сделать API для отдыха, используя spring-boot и MySQL. И я закончил его в своей среде затмения. Следующим шагом будет создание образа докера. Однако, когда я запускаю сервер MySQL и мой оставшийся API в докере, это дает мне ошибку отказа в соединении.

Я нашел другие основные учебники по Spring-Boot и MySQL. Но я не могу решить эту проблему.

Это настройка mysql проекта spring-boot.

spring.datasource.url = jdbc:mysql://127.0.0.1:3306/users?allowPublicKeyRetrieval=true&useSSL=false&useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.username = root
spring.datasource.password = root

#spring.ldap.embedded.base-dn=dc=example,dc=org

#spring.ldap.base=dc=example,dc=org
#spring.ldap.password=admin
#spring.ldap.username=cn=admin,dc=example,dc=org
#spring.ldap.urls=ldap://localhost:389

##Hibernate Properties
# The SQL dialect makes Hibernate generate better SQL for the chosen database
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect

#Open session in View
#spring.jpa.open-in-view=true

# Hibernate ddl auto (create, create-drop, validate, update)
spring.jpa.hibernate.ddl-auto=update
spring.jpa.generate.ddl-auto=update

Это команда для запуска mysql в докере.

docker urn -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root --name mysql mysql

Это мой файл докера для создания образа докера для API отдыха.

FROM java:8
VOLUME /tmp
EXPOSE 8080
ADD target/userManageWithRest-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

Это сообщение об ошибке.

Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_111]
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_111]
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_111]
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_111]
        at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61) ~[mysql-connector-java-8.0.15.jar!/:8.0.15]
        at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) ~[mysql-connector-java-8.0.15.jar!/:8.0.15]
        at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:151) ~[mysql-connector-java-8.0.15.jar!/:8.0.15]
        at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:167) ~[mysql-connector-java-8.0.15.jar!/:8.0.15]
        at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:91) ~[mysql-connector-java-8.0.15.jar!/:8.0.15]
        at com.mysql.cj.NativeSession.connect(NativeSession.java:152) ~[mysql-connector-java-8.0.15.jar!/:8.0.15]
        at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:955) ~[mysql-connector-java-8.0.15.jar!/:8.0.15]
        at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:825) ~[mysql-connector-java-8.0.15.jar!/:8.0.15]
        ... 56 common frames omitted
Caused by: java.net.ConnectException: Connection refused (Connection refused)
        at java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:1.8.0_111]
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_111]
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_111]
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[na:1.8.0_111]
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_111]
        at java.net.Socket.connect(Socket.java:589) ~[na:1.8.0_111]
        at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:155) ~[mysql-connector-java-8.0.15.jar!/:8.0.15]
        at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:65) ~[mysql-connector-java-8.0.15.jar!/:8.0.15]
        ... 59 common frames omitted

Я уже пытался изменить spring.datasource.url на jdbc:mysql://mysql:3306/users?.... Как я могу решить эту проблему? Пожалуйста помогите.

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
0
1 110
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Поскольку ваша база данных MySQL и приложение Spring Boot работают в отдельном контейнере Docker, доступ localhost или 127.0.0.1 в контейнере Docker не относится к localhost вашего хост-компьютера.

Я бы предложил использовать docker-compose, чтобы связать приложение Spring Boot с вашим контейнером MySQL и сделать его доступным через mysql как имя хоста, как вы уже пробовали (jdbc:mysql://mysql:3306/users?...):

version: "3"  
services:
  backend:
    build: .
    depends_on:
      - "mysql"
    links:
      - mysql
    ports:
      - "8080:8080"
  mysql:
    image: mysql:latest
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root

Сохраните это в папке, где находится ваш Spring Boot Dockerfile, ​​как docker-compose.yml и запустите docker-compose build && docker-compose run.

С атрибутом links, чтобы предоставить доступ к вашему контейнеру MySQL через имя контейнера, и поскольку они используют одну и ту же сеть Docker, имя хоста mysql разрешается правильно.

Возникает та же ошибка.. (Caused by: java.net.ConnectException: Connection refused (Connection refused), Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure backend_1 | backend_1 | The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.)

Rect 16.07.2019 08:00

Вам нужно изменить URL-адрес источника данных на SPRING_DATASOURCE_URL = jdbc:mysql://mysql:3306/users?allowPublicKeyRetrieval=true&u‌​seSSL=false&useUnico‌​de=true&useJDBCCompl‌​iantTimezoneShift=tr‌​ueuseLegacyDatetimeC‌​ode=false&serverTime‌

Aritz 16.07.2019 08:06

Несмотря на то, что этот вопрос немного устарел, я считаю, что это объяснение может быть полезным.

Причина вашей проблемы в том, что вы можете контролировать порядок запуска сервисов и завершить работу с помощью опции depends_on. Compose всегда запускает и останавливает контейнеры в порядке зависимостей, где зависимости определяются depend_on, links...

Однако для запуска Compose не ждет пока контейнер не будет «готов» (что бы это ни значило для вашего конкретного приложения) — только до тех пор, пока он не запустится.

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

Есть некоторые обходные пути для этого. Если вы заинтересованы в них, вы можете проверить этот вопрос.

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