如何使用docker连接spring-boot和mysql?

时间:2019-07-16 05:32:19

标签: mysql spring-boot docker

我试图使用spring-boot和MySQL制作一些其他的API。 我在日食环境中完成了它。 下一步是创建docker映像。 但是,当我在docker中运行MySQL服务器和其余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

这是我的docker文件,用于为其余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

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

2 个答案:

答案 0 :(得分:0)

由于您的MySQL数据库和Spring Boot应用程序在单独的Docker容器中运行,因此在Docker容器中访问localhost127.0.0.1并不是指主机的localhost

我建议使用docker-compose将Spring Boot应用程序链接到您的MySQL容器,并使其通过主机名通过mysql进行访问,就像您已经尝试过的那样(jdbc:mysql://mysql:3306/users?...):< / p>

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属性可以通过容器名称访问MySQL容器,并且它们共享相同的Docker网络,因此links主机名可以正确解析

答案 1 :(得分:0)

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

问题的原因是您可以control the order of service startup并使用depends_on选项关闭。 Compose始终以依赖关系顺序启动和停止容器,其中依赖关系由depends_on,链接...

确定。

但是,对于启动来说,Compose不会等待直到容器“准备就绪” (对于您的特定应用程序而言意味着什么)-仅在容器运行之前。

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

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