无法将mysql docker容器与spring boot应用程序连接 - 通信链接失败。

3

我是一个新手,正在学习Docker。我正在使用Spring Boot微服务,在我的本地机器上运行良好。现在,我需要为我的应用程序创建一个容器镜像。它依赖于Mysql服务器。我正在使用docker-compose来创建我的容器。在运行我的自定义镜像(Spring Boot应用程序)时,出现了通信链接失败的错误。但是,Mysql镜像可以独立运行。

我的yml文件:

Original Answer: "最初的回答"
version: '2'

services:

  mysql-dev:
    image: mysql:5.7
    container_name: mysql-dev
    environment:
      MYSQL_ROOT_PASSWORD: "password"
      MYSQL_DATABASE: "onlinetutorialspoint"
    networks:
      - my_mysql_net
    ports:
      - 3306:3308

  spring_boot_db_service:
    depends_on:
      - mysql-dev
    image: spring_boot_db_service
    ports:
      - 8181:8181
    links:
      - mysql-dev:mysql
    networks:
      - my_mysql_net

networks:
  my_mysql_net:
    driver: bridge 

应用程序属性文件:

db.driver: com.mysql.jdbc.Driver

spring.datasource.url = jdbc:mysql://mysql-dev:3308/onlinetutorialspoint?useSSL=false

spring.datasource.username = root

spring.datasource.password = password

完整错误信息:

spring_boot_db_service_1 | 2019-01-28 13:34:06.955 INFO 1 --- [main] org.hibernate.cfg.Environment: HHH000206: 未找到 hibernate.properties spring_boot_db_service_1 | 2019-01-28 13:34:07.000 INFO 1 --- [main] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.0.1.Final} spring_boot_db_service_1 | 2019-01-28 13:34:08.430 WARN 1 --- [main] o.h.e.j.e.i.JdbcEnvironmentInitiator : HHH000342: 无法获取连接以查询元数据:通信链路失败 spring_boot_db_service_1 | 最后一次成功发送到服务器的数据包是 0 毫秒前。驱动程序没有从服务器接收到任何数据包。 spring_boot_db_service_1 | 2019-01-28 13:34:08.443 INFO 1 --- [main] org.hibernate.dialect.Dialect : HHH000400: 使用方言:org.hibernate.dialect.MySQL5Dialect spring_boot_db_service_1 | 2019-01-28 13:34:08.459 INFO 1 --- [main] o.h.e.j.e.i.LobCreatorBuilderImpl : HHH000422: 禁用上下文 LOB 创建,因为连接为空 spring_boot_db_service_1 | 2019-01-28 13:34:08.921 WARN 1 --- [main] ConfigServletWebServerApplicationContext : 在上下文初始化期间遇到异常 - 取消刷新尝试:org.springframework.beans.factory.UnsatisfiedDependencyException: 通过字段 'dbServiceDao' 表达的未满足的依赖关系创建 bean 时出错;嵌套异常是 org.springframework.beans.factory.UnsatisfiedDependencyException: 通过字段 'sessionFactory' 表达的未满足的依赖关系创建 bean 时出错;嵌套异常是 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [com/htc/dbservice/configuration/DBConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.MappingException: Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister spring_boot_db_service_1 | 2019-01-28 13:34:08.923 WARN 1 --- [main] o.s.b.f.support.DisposableBeanAdapter : 在名为 'eurekaRegistration' 的 bean 上调用销毁方法 'close' 失败:org.springframework.beans.factory.BeanCreationNotAllowedException: 创建名为 'org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration$RefreshableEurekaClientConfiguration' 的 bean 时不允许使用单例,因为此工厂的单例正在销毁中(在销毁方法实现中不要从 BeanFactory 请求 bean!) spring_boot_db_service_1 | 2019-01-28 13:34:08.926 INFO 1 --- [main] o.apache.catalina.core.StandardService : 停止服务 [Tomcat] docker_spring_boot_db_service_1 退出,代码为 1

欢迎来到Stackoverflow,伙计!请看一下如何格式化你的文本,这样更容易阅读。 - Daniel W.
你能分享完整准确的错误信息吗? - Nico Haase
@NicoHaase 谢谢您的回复,我已经在问题部分添加了堆栈跟踪。谢谢 - ARUNKUMAR SANTHANAM
1
你在创建容器后是否更改了密码?如果是的话,不仅需要重新启动容器,还需要清除卷,因为Compose会在运行之间保留数据库状态。另外,请确保在启动Spring Boot应用程序之前启动数据库(可能需要等待脚本),links不能确保MySQL已经启动并准备好连接。 - Yann39
@Yann39 谢谢你的回复。由于我正在使用版本2,我已经在我的命令部分中添加了https://github.com/Eficode/wait-for sh文件。我还在终端中进行了验证。然而,我仍然遇到同样的问题。在yml文件中添加的命令是:command: sh -c './wait-for mysql-dev:3306 -- npm start' - ARUNKUMAR SANTHANAM
1个回答

1

你是否更改了默认的mysql端口?如果没有,你指向的可能是错误的端口号。当你映射端口以将服务发布到外部时,顺序是

<host-port>:<container-port>

services:   
   mysql-dev:  
     image: mysql:5.7  
     container_name: mysql-dev  
     environment:  
       MYSQL_ROOT_PASSWORD: "password"  
       MYSQL_DATABASE: "onlinetutorialspoint"  
     networks:  
       - my_mysql_net  
     ports:  
       - 3308:3306  

使用docker-compose并将两个服务连接到同一个网络,您可以直接连接到容器,而无需将mysql端口发布到外部网络。尝试更改Spring应用程序以指向mysql-dev:3306,或尝试连接到spring_boot_db_service容器。
docker-compose exec spring_boot_db_service bash  

并对数据库容器进行连接测试。


感谢您的回复。我已经尝试了您的解决方案,但问题仍未解决。请注意:如果我提到一个MySQL Docker容器的动态IP地址,应用程序将正常运行。即jdbc:mysql://172.22.0.2:3306/onlinetutorialspoint?useSSL=false - ARUNKUMAR SANTHANAM
好的,你改了docker-compose文件吗?如果你改了,你需要重新创建服务。尝试执行docker-compose down和UP来重新创建服务。如果还是不起作用,请尝试连接到Spring应用程序,并进行名称解析测试,以查看是否存在名称问题。 - mauricubo
嗨,我已经检查了open jdk(父)镜像指向11.0.1。我所参考的代码具有较低版本的父镜像(版本8)。父镜像版本对于docker配置真的很重要吗? - ARUNKUMAR SANTHANAM
嗨,我认为这对于Docker配置来说并不重要,但对于你的代码兼容性来说很重要。我不知道你的代码是如何实现的,但根据你发布的错误信息来看,根本原因可能是兼容性问题。 - mauricubo
哇,非常感谢。这只是我的错误。现在应用程序使用Java 8运行良好。将父镜像添加为FROM openjdk:8。 - ARUNKUMAR SANTHANAM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接