当前位置: 首页 > 知识库问答 >
问题:

如何使用docker连接Spring启动和mysql?

闾丘书
2023-03-14

我尝试使用spring boot和MySQL制作一些rest API。我在我的eclipse环境中完成了它。下一步是创建docker映像。然而,当我在docker中运行MySQL服务器和RESTAPI时,它会给我一个连接拒绝错误。

我找到了其他基本的spring-boot和MySQL教程。但我无法解决这个问题。

这是 spring-boot 项目的 mysql 设置。

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

这是在docker中运行mysql的命令。

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

这是我的docker文件,为rest API制作docker映像。

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

我已经尝试修改<code>spring.datasource。url到html" target="_blank">jdbc:mysql://mysql:3306/users?...。我如何解决这个问题?请帮帮我。

共有2个答案

强保臣
2023-03-14
匿名用户

尽管这个问题有点老了,但我相信这个解释可能是有用的。

您的问题的原因是您可以使用< code>depends_on选项控制服务启动和关闭的顺序。Compose总是按照依赖关系顺序启动和停止容器,其中依赖关系由depends_on,links决定...

然而,对于启动来说,Compose不会等到容器“就绪”(无论对您的特定应用程序意味着什么)之后,而只是等到它运行时。

这可能会导致一些问题,例如,您的spring-boot应用程序启动速度非常快并尝试连接到MySQL,但即使MySQL容器已经启动 - MySQL内部尚未准备好接受连接。

有一些解决方法。如果您对它们感兴趣,则可能需要检查此问题。

罗烨霖
2023-03-14

由于MySQL数据库和Spring Boot应用程序在单独的Docker容器中运行,因此Docker集装箱中的access<code>localhost。

我建议使用< code>docker-compose将Spring Boot应用程序链接到您的MySQL容器,并通过< code>mysql作为您已经尝试过的主机名来访问它(< code > 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 BootDockerfile位于docker-compose.yml和运行docker-compose build的文件夹中

使用<code>links</code>属性,通过容器名称访问MySQL容器,并且由于它们共享同一Docker网络,因此<code>MySQL</code>主机名解析正确

 类似资料:
  • 我正在尝试运行一个Spring Boot应用程序,其中db必须连接到Docker上的MySQL容器。我使用了以下代码和命令。 应用程序属性: 用于创建容器的命令 从Docker Hub提取mysql映像: 创建容器: 在此命令之后,将创建一个容器,即使它已启动并正常工作。我能够登录到sql bash并执行一些查询。 我尝试使用多个jdbc网址: < Li > JDBC:MySQL://mysqld

  • 问题内容: 我已经用docker compose设置了elasticsearch和kibana。elasticsearch 部署在:kibana部署在 当尝试通过docker run部署metricbeat时,出现以下错误: 我的docker-compose.yml: 问题答案: 首先通过添加默认码头工人网络的名称来编辑文件: 执行,然后从以下命令开始: 说明: 当您尝试进行部署时,您需要提供以下

  • 我正在尝试按照一个简单的示例应用程序教程来创建一个Spring启动应用程序并将其连接到mysql数据库。使用智能诊断。https://www.youtube.com/watch?v=YVl6M5ztOu8 项目结构: 当我尝试运行此示例应用程序时,我收到以下错误消息: **运行该程序的步骤: 在称为“restfulapi”的 mysql 工作台中创建连接 参数是本地主机端口 3306 的 root

  • 这是我的: 和Dockerfile goparser: 连接MongoDB需要使用哪个地址?

  • 我使用Spring教程创建了一个单页应用程序,使用AngularJS和OAuth创建一个单页应用程序,可以在以下位置找到:https://Spring . io/guides/tutorials/Spring-security-and-angular-js/# _ multiple _ ui _ applications _ and _ a _ gateway _ Single _ Page _

  • 我正在代理服务器后面开发一个Spring Boot应用程序。现在我需要连接到外部API,但我还没有弄清楚要配置什么才能使应用程序连接到外部API,我已经尝试用程序参数传递代理数据,并且已经尝试在Java控制面板中配置代理。如何让应用程序使用代理来访问API?