无法将 mysql docker 容器与 Spring Boot 应用程序链接 - 通信链接失败

Posted

技术标签:

【中文标题】无法将 mysql docker 容器与 Spring Boot 应用程序链接 - 通信链接失败【英文标题】:Unable to link mysql docker container with spring boot application - Communications link failure 【发布时间】:2019-06-21 12:54:06 【问题描述】:

我是 Docker 新手。我正在使用 Spring Boot 微服务。它在我的本地机器上运行良好。现在,我需要为我的应用程序创建一个 docker 映像。它依赖于 mysql 服务器。我正在使用 docker-compose 创建我的容器。运行自定义映像(弹簧启动应用程序)时出现通信链路故障错误。 Mysql 镜像独立运行良好。

我的 yml 文件:

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 信息 1 --- [ 主要] org.hibernate.cfg.Environment:HHH000206: hibernate.properties 未找到 spring_boot_db_service_1 | 2019-01-28 13:34:07.000 信息 1 --- [主要] o.hibernate.annotations.common.Version:HCANN000001:休眠 公共注释 5.0.1.Final spring_boot_db_service_1 | 2019-01-28 13:34:08.430 警告 1 --- [ma​​in] o.h.e.j.e.i.JdbcEnvironmentInitiator:HHH000342:无法获得 查询元数据的连接:通信链路故障 spring_boot_db_service_1 | spring_boot_db_service_1 |最后 成功发送到服务器的数据包是 0 毫秒前。这 驱动程序没有收到来自服务器的任何数据包。 spring_boot_db_service_1 | 2019-01-28 13:34:08.443 信息 1 --- [ 主要] org.hibernate.dialect.Dialect:HHH000400:使用 方言:org.hibernate.dialect.MySQL5方言 spring_boot_db_service_1 | 2019-01-28 13:34:08.459 信息 1 --- [主要] o.h.e.j.e.i.LobCreatorBuilderImpl :HHH000422:禁用 上下文 LOB 创建为连接为空 spring_boot_db_service_1 | 2019-01-28 13:34:08.921 警告 1 --- [ main] ConfigServletWebServerApplicationContext:遇到异常 在上下文初始化期间 - 取消刷新尝试: org.springframework.beans.factory.UnsatisfiedDependencyException: 创建名为“dbServiceImpl”的 bean 时出错:不满足的依赖关系 通过字段 'dbServiceDao' 表示;嵌套异常是 org.springframework.beans.factory.UnsatisfiedDependencyException: 创建名为 'dbServiceDaoImpl' 的 bean 时出错:通过字段 'sessionFactory' 表达的依赖关系不满足;嵌套异常 是 org.springframework.beans.factory.BeanCreationException: 错误 创建在类路径中定义的名称为 'sessionFactory' 的 bean 资源 [com/htc/dbservice/configuration/DBConfiguration.class]: 调用 init 方法失败;嵌套异常是 org.hibernate.MappingException:无法获取构造函数 org.hibernate.persister.entity.SingleTableEntityPersister spring_boot_db_service_1 | 2019-01-28 13:34:08.923 警告 1 --- [ main] o.s.b.f.support.DisposableBeanAdapter : 调用销毁 名称为“eurekaRegistration”的 bean 上的“关闭”方法失败: org.springframework.beans.factory.BeanCreationNotAllowedException: 创建具有名称的 bean 时出错 'org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration$RefreshableEurekaClientConfiguration': 此工厂的单例时不允许创建单例 bean 处于销毁状态(不要从 BeanFactory 中请求 bean 销毁方法实现!) spring_boot_db_service_1 | 2019-01-28 13:34:08.926 信息 1 --- [主要] o.apache.catalina.core.StandardService :停止服务 [Tomcat] docker_spring_boot_db_service_1 以代码 1 退出

【问题讨论】:

欢迎来到 *** 好友!请看一下如何格式化您的文本,这不容易阅读。 你能分享完整准确的错误信息吗? @NicoHaase 感谢您的回复,我已在问题部分添加了堆栈跟踪。谢谢 您是否在首次创建容器后更改了密码?如果是,您不仅需要重新启动容器,还需要清理卷,因为 Compose 正在做一些额外的事情来保存运行之间的数据库状态。还要确保您的数据库在您的 Spring Boot 应用程序之前启动(您可能需要等待脚本),links 不确保 MySQL 已启动并准备好连接。 @Yann39 感谢您的回复。由于我使用的是版本 2,因此我在命令部分添加了 github.com/Eficode/wait-for sh 文件。我也在终端中验证了相同的内容。不过,我遇到了同样的问题。在 yml 文件中添加的命令:命令:sh -c './wait-for mysql-dev:3306 -- npm start' 【参考方案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 好的,你改变了 docker-compose 文件了吗?如果您更改了它,则需要重新创建服务。尝试执行 docker-compose down 和 UP 以重新创建服务。如果仍然无法正常工作,请尝试连接到 spring 应用并进行名称解析测试,以查看名称是否有问题。 嗨,我检查了打开的 jdk(父)图像指向 11.0.1。我提到的代码具有较低的父图像(版本 8)。父镜像版本对 docker 配置真的很重要吗? 嗨,我不认为这对 docker 配置很重要,但对你的代码兼容很重要。我不知道您的代码是如何实现的,但查看您发布的错误消息,根本原因可能是兼容性。 哇,非常感谢。只是我的错。现在应用程序在 java 8 上运行良好。添加父图像作为 FROM openjdk:8

以上是关于无法将 mysql docker 容器与 Spring Boot 应用程序链接 - 通信链接失败的主要内容,如果未能解决你的问题,请参考以下文章

mysql docker容器 - 无法与Windows连接

Mariadb docker容器无法使用Python连接到主机上的MySQL服务器(111连接被拒绝)

无法使用 docker 容器连接到 MySQL 数据库

Spring Boot + MySQL docker 容器

docker容器跑起mysql后,在宿主机无法进去mysql?

如何将 MySQL 转储从主机恢复到 Docker 容器