Я попытался сделать 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?....
Как я могу решить эту проблему?
Пожалуйста помогите.






Поскольку ваша база данных 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 разрешается правильно.
Вам нужно изменить URL-адрес источника данных на SPRING_DATASOURCE_URL = jdbc:mysql://mysql:3306/users?allowPublicKeyRetrieval=true&useSSL=false&useUnicode=true&useJDBCCompliantTimezoneShift=trueuseLegacyDatetimeCode=false&serverTime
Несмотря на то, что этот вопрос немного устарел, я считаю, что это объяснение может быть полезным.
Причина вашей проблемы в том, что вы можете контролировать порядок запуска сервисов и завершить работу с помощью опции depends_on. Compose всегда запускает и останавливает контейнеры в порядке зависимостей, где зависимости определяются depend_on, links...
Однако для запуска Compose не ждет пока контейнер не будет «готов» (что бы это ни значило для вашего конкретного приложения) — только до тех пор, пока он не запустится.
Это может вызвать некоторые проблемы, например. ваше приложение с весенней загрузкой запускается очень быстро и пытается подключиться к MySQL, но даже несмотря на то, что контейнер MySQL запущен, 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.)