无法从 Spring Boot Docker 容器连接 mysql Docker 容器

Posted

技术标签:

【中文标题】无法从 Spring Boot Docker 容器连接 mysql Docker 容器【英文标题】:not able to connect mysql docker container from spring boot docker container 【发布时间】:2021-04-04 07:11:57 【问题描述】:

我收到以下错误

2020-12-26 23:17:30.499 INFO 1 --- [main] org.hibernate.dialect.Dialect:HHH000400:使用方言:org.hibernate.dialect.mysql57Dialect 许可服务_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:通信链路故障 许可服务_1 | 许可服务_1 |最后一个成功发送到服务器的数据包是 0 毫秒前。驱动程序没有收到来自服务器的任何数据包。 许可服务_1 |在 com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) ~[mysql-connector-java-8.0.22.jar:8.0.22] 许可服务_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

【问题讨论】:

【参考方案1】:

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

这在Docker-Compose docs中有解释。

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

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

请务必注意 HOST_PORT 和 CONTAINER_PORT 之间的区别。 [...] 网络服务到服务通信使用 CONTAINER_PORT。定义 HOST_PORT 后,该服务也可以在 swarm 外部访问。

【讨论】:

以上是关于无法从 Spring Boot Docker 容器连接 mysql Docker 容器的主要内容,如果未能解决你的问题,请参考以下文章

无法从 Spring Boot Docker 容器连接到本地 MySQL 数据库服务器

无法从Spring Boot Docker容器连接到本地MySQL数据库服务器

在 Docker 容器内运行 Spring Boot 应用程序,无法连接 MySQL

如何从不同的 docker 容器中读取 Spring Boot 应用程序属性?

Docker:无法连接 Spring Boot 和 MYSQL

使用docker-compose时无法访问docker容器内的spring-boot rest-endpoint