Docker部署Spring Boot应用无法连接Docker MySQL问题求助
Spring Boot Docker容器无法连接Docker MySQL的解决方案
本地运行Spring Boot应用能正常连接Docker中的MySQL,MySQL Workbench也能访问该实例,但将应用打包为Docker镜像运行时出现连接拒绝错误,核心原因为JDBC连接失败。
核心问题原因
Docker容器内的127.0.0.1指向容器自身的localhost,而非宿主机,因此无法访问宿主机上运行的MySQL容器。
解决方案
方案1:使用Docker自定义网络(推荐)
这是Docker容器间通信的标准方式,通过自定义网络实现容器间的DNS解析。
- 创建自定义Docker网络:
docker network create spring-mysql-network
- 启动MySQL容器时加入该网络(指定容器名为
mysql-db):
docker run -d \ --name mysql-db \ --network spring-mysql-network \ -e MYSQL_ROOT_PASSWORD=root \ -e MYSQL_DATABASE=test \ -p 3306:3306 \ mysql:8.0
- 修改
application.yml中的数据库URL,使用MySQL容器名作为主机:
spring: datasource: url: jdbc:mysql://mysql-db:3306/test?useSSL=false&serverTimezone=UTC username: root password: root jpa: hibernate: ddl-auto: update properties: hibernate: dialect: org.hibernate.dialect.MySQL8Dialect format_sql: true
- 构建并启动Spring Boot容器,加入同一网络:
docker build -t spring-mysql-app . docker run -d \ --name spring-app \ --network spring-mysql-network \ -p 8080:8080 \ spring-mysql-app
方案2:使用宿主机IP地址
找到宿主机的局域网IP(例如192.168.1.100),替换配置中的127.0.0.1:
修改application.yml:
spring: datasource: url: jdbc:mysql://192.168.1.100:3306/test?useSSL=false&serverTimezone=UTC username: root password: root
注意:确保MySQL容器已映射3306端口到宿主机,且宿主机防火墙允许3306端口的入站连接。
方案3:使用Host网络模式(不推荐)
运行Spring Boot容器时使用--network host参数,让容器直接使用宿主机的网络栈,此时容器内的127.0.0.1指向宿主机:
docker run -d \ --name spring-app \ --network host \ spring-mysql-app
该方式会破坏容器的网络隔离性,仅适合临时测试,不推荐生产环境使用。
额外检查项
- 确认MySQL容器的
bind-address设置为0.0.0.0(允许所有IP访问),MySQL 8.0默认已开启此配置。 - 验证MySQL容器是否正常运行:执行
docker logs mysql-db查看日志,确认服务启动成功。 - 检查数据库用户名、密码是否与MySQL容器初始化时的配置一致。
内容的提问来源于stack exchange,提问作者Ahmed Ali
相关产品推荐
相关产品推荐

