首页 > 解决方案 > Spring Boot 应用程序无法连接到在 Docker 容器中运行的 MySQL 数据库

问题描述

application.yml

spring:
  profiles: container
  datasource:
    url: jdbc:mysql://${DATABASE_HOST}:${DATABASE_PORT}/${DATABASE_NAME}
    username: ${DATABASE_USER}
    password: ${DATABASE_PASSWORD}
    initialize: true
    tomcat:
      max-active: 1
jpa:
    database-platform: org.hibernate.dialect.MySQLDialect

docker-compose.yml

version: '3.1'
services: 
  demo-mysql:
    image: mysql:latest
    environment:
      - MYSQL_ROOT_PASSWORD=root
  spring-boot-app:
    image: chinmayee/chinmayee
    depends_on:
      - demo-mysql
    ports:
      - 9090:8080
    environment:
      - DATABASE_HOST=demo-mysql
      - DATABASE_PORT=3306
      - DATABASE_NAME=chinmayee
      - DATABASE_USER=root
      - DATABASE_PASSWORD=root

pom.xml片段:

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-jpa -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.46</version>
        </dependency>
    </dependencies>

我的应用程序无法连接到容器中运行的 Db。我看到这个错误:

Caused by: java.net.ConnectException: Connection refused (Connection refused)
    at java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:1.8.0_171]
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_171]
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_171]
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[na:1.8.0_171]
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_171]
    at java.net.Socket.connect(Socket.java:589) ~[na:1.8.0_171]
    at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:211) ~[mysql-connector-java-5.1.46.jar!/:5.1.46]
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:301) ~[mysql-connector-java-5.1.46.jar!/:5.1.46]

标签: spring-bootspring-data-jpadocker-compose

解决方案


我认为容器 demo-mysql 上的端口 3306 未转发

尝试添加端口配置

version: '3.1'
services: 
  demo-mysql:
    image: mysql:latest
    ports:
      - 3306:3306
    environment:
      - MYSQL_ROOT_PASSWORD=root

推荐阅读