Spring boot JDBC无法连接到docker容器中的mysql

Posted

技术标签:

【中文标题】Spring boot JDBC无法连接到docker容器中的mysql【英文标题】:Spring boot JDBC can't connect to mysql in docker container 【发布时间】:2020-01-29 10:05:06 【问题描述】:

我正在尝试在两个单独的 docker 容器中运行 spring boot 应用程序(作为简单的 REST api)和 mysql 服务器。但是,我无法让spring app中的jdbc连接连接到mysql。它们都是独立工作的,当我在本地运行 spring boot 和 mysql 时,实现工作正常。

docker-compose.yml

version: '3'
services:
  database:
    image: mysql:latest
    container_name: mysqldb
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=password
    expose:
      - 3306
    ports:
      - 3306:3306
    networks:
      - backend
    volumes:
      - "dbdata:/var/lib/mysql"

  web:
    container_name: springboot
    build: .
    depends_on:
      - database
    expose:
      - 8080
    ports:
      - 8080:8080
    networks:
      - backend

networks:
  backend:

volumes:
  dbdata:

在 Spring Boot 应用中:

val dataSource = DriverManagerDataSource()
dataSource.setDriverClassName("com.mysql.jdbc.Driver")
dataSource.setUrl("jdbc:mysql://mysqldb:3306/$dbName?characterEncoding=latin1")
dataSource.username = "dev"
dataSource.password = "password"

val jdbcTemplate = JdbcTemplate(dataSource)

spring boot 返回错误:


    "status": 500,
    "error": "Internal Server Error",
    "message": "Failed to obtain JDBC Connection; nested exception is com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure\n\nThe last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server."

我能够通过 mysql cli 从 Spring Boot 容器连接到 mysql 容器。因此,springboot 容器似乎能够解析“mysqldb”。

这看起来应该很简单。我不确定错误在哪里,但我猜它与我不熟悉的弹簧靴内部工作有关。

【问题讨论】:

【参考方案1】:

将此 dataSource.setUrl("jdbc:mysql://mysqldb:3306/$dbName") 更改为:

dataSource.setUrl("jdbc:mysql://database:3306/$dbName")

你在compose中的服务名称是database,所以你需要使用它

【讨论】:

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

我无法使用 Spring Boot 和 JPA 连接到 mysql 数据库

Spring Boot / Data 通过 jdbc UCanAccess 连接到 MS Access

将 Spring-Boot 连接到 MySQL

Spring Boot 无法从数据源确定 jdbc url

Spring boot Oracle Gradle:无法加载驱动程序类:oracle.jdbc.OracleDriver

无法使用 JDBC 和 Spring 连接到 MySQL [重复]