首页 > 解决方案 > 无法从 Spring Boot Docker 容器连接 mysql Docker 容器

问题描述

我收到以下错误

2020-12-26 23:17:30.499 INFO 1 --- [main] org.hibernate.dialect.Dialect:HHH000400:使用方言:org.hibernate.dialect.MySQL57Dialect licenseservice_1 | 休眠:如果存在许可许可服务_1,则删除表 | 2020-12-26 23:17:31.006 INFO 1 --- [main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - 开始...许可服务_1 | 2020-12-26 23:17:32.010 错误 1 ​​--- [main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - 池初始化期间出现异常。许可服务_1 | 许可服务_1 | com.mysql.cj.jdbc.exceptions.CommunicationsException:通信链路故障许可service_1 | 许可服务_1 | 最后一个成功发送到服务器的数据包是 0 毫秒前。驱动程序没有收到来自服务器的任何数据包。许可服务_1 | 在 com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) ~[mysql-connector-java-8.0.22.jar:8.0.22] licenseservice_1 | 在 com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64) ~[mysql-connector-java-8.0.22.jar:8.0.22]

我的 docker-compose yml

version : '3'
services:
  licensingservice:
    image: licensing/licensing-service-ms:0.0.1-SNAPSHOT
    ports:
      - "8080:8080"
    networks:
      - my-network
    volumes:
      - .:/vol/development
    depends_on:
      - mysqldbserver
      
  mysqldbserver:
    image: mysql:5.7
    ports:
      - "3307:3306"
    networks:
      - my-network
    environment:
      MYSQL_DATABASE: license
      MYSQL_ROOT_PASSWORD: Spartans@123 
    container_name: mysqldb
networks:
  my-network:
    driver: bridge

和我的 application.properties

spring.jpa.hibernate.ddl-auto=create-drop
spring.datasource.url=jdbc:mysql://mysqldb:3307/license
spring.datasource.username=root
spring.datasource.password=Spartans@123
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.show-sql=true

标签: javamysqlspring-boot

解决方案


尝试连接到端口 3306。您将数据库容器上的端口 3306 暴露给端口 3307 上的主机,但这不会改变同一网络内服务之间的通信。

这在Docker-Compose 文档中进行了解释。

默认情况下,Compose 会为您的应用程序设置一个网络。服务的每个容器都加入默认网络,并且可以被该网络上的其他容器访问,并且可以通过与容器名称相同的主机名被它们发现。

此外,您可以通过定义主机端口和容器端口之间的映射来选择将这些端口公开给外界。但是,这对同一网络内的服务之间的通信没有影响:

注意 HOST_PORT 和 CONTAINER_PORT 之间的区别很重要。[...] 网络服务到服务通信使用 CONTAINER_PORT。当 HOST_PORT 被定义时,服务也可以在 swarm 之外访问。


推荐阅读