Spring boot JDBC可以';t连接到docker容器中的mysql

Spring boot JDBC可以';t连接到docker容器中的mysql,mysql,spring-boot,docker,jdbc,Mysql,Spring Boot,Docker,Jdbc,我正在尝试在两个独立的docker容器中运行SpringBoot应用程序(作为一个简单的RESTAPI)和mysql服务器。但是,我无法让spring应用程序中的jdbc连接连接到mysql。它们都是独立工作的,当我在本地运行SpringBoot和mysql时,实现就可以工作了 docker-compose.yml version: '3' services: database: image: mysql:latest container_name: mysqldb

我正在尝试在两个独立的docker容器中运行SpringBoot应用程序(作为一个简单的RESTAPI)和mysql服务器。但是,我无法让spring应用程序中的jdbc连接连接到mysql。它们都是独立工作的,当我在本地运行SpringBoot和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启动返回的错误:

{
    "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引导容器连接到mysql容器。因此,springboot容器似乎能够解析“mysqldb”


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

更改此
dataSource.setUrl(“jdbc:mysql://mysqldb:3306/$dbName”)
,发送至:

dataSource.setUrl("jdbc:mysql://database:3306/$dbName")
您在
compose
中的服务名称是
database
,因此您需要使用它