【问题标题】:How to connect spring-boot and mysql using docker?如何使用docker连接spring-boot和mysql?
【发布时间】:2019-11-24 19:06:47
【问题描述】:

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

我找到了其他基本的 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

这是我为 rest API 制作 docker 镜像的 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

我已经尝试将spring.datasource.url 修改为jdbc:mysql://mysql:3306/users?...。 我怎么解决这个问题? 请帮帮我。

【问题讨论】:

    标签: mysql spring-boot docker


    【解决方案1】:

    由于您的 MySQL 数据库和 Spring Boot 应用程序在单独的 Docker 容器中运行,因此在 Docker 容器中访问 localhost127.0.0.1 并不是指主机的 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.)
    • 您需要将数据源 url 更改为 SPRING_DATASOURCE_URL = jdbc:mysql://mysql:3306/users?allowPublicKeyRetrieval=true&useSSL=false&useUnicode=true&useJDBCCompliantTimezoneShift=trueuseLegacyDatetimeCode=false&serverTimezone=UTC github.com/spring-guides/gs-spring-boot-docker/issues/37
    【解决方案2】:

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

    您的问题的原因是您可以control the order of service startup 并使用depends_on 选项关闭。 Compose 总是按依赖顺序启动和停止容器,其中依赖由depends_on、links...决定。

    但是,对于启动 Compose 不会等到容器“准备就绪”(无论这对您的特定应用程序意味着什么) - 只等到它运行。

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

    有一些解决方法。如果您对它们感兴趣,您可能需要查看this question

    【讨论】:

      猜你喜欢
      • 2020-07-24
      • 2020-07-12
      • 2020-06-06
      • 2019-06-06
      • 2022-07-12
      • 2017-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多