You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot+Docker Compose连接MySQL失败及phpMyAdmin无法连接求助

问题排查:Spring Boot + Docker Compose + MySQL 连接失败

问题现象

搭建基于Spring Boot + Docker Compose + MySQL的示例应用时,出现两个核心问题:

  • Spring Boot应用无法连接MySQL,抛出连接拒绝错误
  • phpMyAdmin也无法连接MySQL服务

现有配置

docker-compose.yml

mysql:
  image: mysql:latest
  container_name: mysql-db
  restart: always
  command: --default-authentication-plugin=mysql_native_password
  ports:
    - "33061:3306"
  networks:
    - spring-boot-mysql-net
  environment:
    MYSQL_DATABASE: practice_db
    MYSQL_ROOT_PASSWORD: root
  volumes:
    - ./database_storage:/docker-entrypoint-initdb.d

practice-service:
  container_name: practice-service
  build:
    context: ./
    dockerfile: Dockerfile
  ports:
    - "8080:8080"
  depends_on:
    - mysql
  networks:
    - spring-boot-mysql-net
  restart: on-failure
  command: sh -c './wait-for mysql:3306 -- npm start'

phpMyAdmin:
  image: phpMyAdmin/phpMyAdmin
  container_name: phpMyAdmin
  restart: always
  depends_on:
    - mysql
  environment:
    PMA_HOST: database
    PMA_PORT: 3306
  ports:
    - "9091:80"

networks:
  spring-boot-mysql-net:
    driver: bridge

application.properties

spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=jdbc:mysql://mysql:3306/practice_db
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

错误日志

Spring Boot应用报错

2023-02-11 16:31:10 com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
2023-02-11 16:31:10 The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
2023-02-11 16:31:10 Caused by: java.net.ConnectException: Connection refused

MySQL容器日志

2023-02-11 16:31:42 2023-02-12T00:31:42.117825Z 0 [System] [MY-010931] [Server] 
/usr/sbin/mysqld: ready for connections. Version: '8.0.32'  socket: ' 
/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server - GPL.
2023-02-11 16:31:30 2023-02-12 00:31:30+00:00 [Note] [Entrypoint]: Temporary server started.
2023-02-11 16:31:30 '/var/lib/mysql/mysql.sock' -> '/var/run/mysqld/mysqld.sock'
2023-02-11 16:31:36 2023-02-12 00:31:36+00:00 [Note] [Entrypoint]: Creating database 
practice-db
2023-02-11 16:31:36 
2023-02-11 16:31:36 2023-02-12 00:31:36+00:00 [Note] [Entrypoint]: Stopping temporary server
2023-02-11 16:31:40 2023-02-12 00:31:40+00:00 [Note] [Entrypoint]: Temporary server stopped
2023-02-11 16:31:40 
2023-02-11 16:31:40 2023-02-12 00:31:40+00:00 [Note] [Entrypoint]: MySQL init process done. 
Ready for start up.

修复方案

1. 修正phpMyAdmin的数据库主机配置

phpMyAdmin的PMA_HOST设置为database,但docker-compose中MySQL服务的名称是mysql,容器间通信必须使用服务名作为主机地址。修改phpMyAdmin的环境变量:

phpMyAdmin:
  # 保留其他配置
  environment:
    PMA_HOST: mysql
    PMA_PORT: 3306

2. 修正Spring Boot应用的启动命令

practice-service使用npm start启动,这是Node.js项目的启动方式,不符合Spring Boot应用的运行逻辑。假设你的Dockerfile已将Spring Boot的jar包构建到容器中,修改启动命令为:

practice-service:
  # 保留其他配置
  command: sh -c './wait-for mysql:3306 -- java -jar /app/practice-service.jar'

注意替换/app/practice-service.jar为容器中实际的jar包路径。如果没有wait-for脚本,建议改用MySQL的健康检查机制确保服务就绪:

mysql:
  # 保留其他配置
  healthcheck:
    test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-proot"]
    interval: 5s
    timeout: 5s
    retries: 5

practice-service:
  # 保留其他配置
  depends_on:
    mysql:
      condition: service_healthy

3. 核对数据库名称一致性

从MySQL日志中看到初始化脚本创建的是practice-db,但你在环境变量中配置的数据库名是practice_db(下划线),这会导致Spring Boot连接的数据库不存在。检查./database_storage目录下的初始化SQL脚本,确保创建的数据库名称为practice_db。

4. 验证网络配置

所有服务已加入spring-boot-mysql-net网桥网络,这部分配置正确,容器间可通过服务名正常通信。

验证步骤

  1. 停止并清理现有容器:docker-compose down
  2. 重新构建并启动服务:docker-compose up --build
  3. 实时查看日志:docker-compose logs -f
  4. 访问phpMyAdmin:http://localhost:9091,使用root/root登录验证连接
  5. 访问Spring Boot应用,确认数据库连接正常

内容的提问来源于stack exchange,提问作者ppb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 13:20:28