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网桥网络,这部分配置正确,容器间可通过服务名正常通信。
验证步骤
- 停止并清理现有容器:
docker-compose down - 重新构建并启动服务:
docker-compose up --build - 实时查看日志:
docker-compose logs -f - 访问phpMyAdmin:http://localhost:9091,使用root/root登录验证连接
- 访问Spring Boot应用,确认数据库连接正常
内容的提问来源于stack exchange,提问作者ppb
相关产品推荐
相关产品推荐

