Java Spring Boot与MySQL的Docker容器搭建及通信故障解决
解决Spring Boot Docker容器与MySQL Docker容器通信问题
我来帮你搞定这个容器通信的坑!你的问题大概率出在网络隔离或者数据库连接配置错误上,下面给你一步步梳理正确的操作流程和排查方法:
核心问题拆解
你现在的操作是分别启动两个容器,但它们可能不在同一个Docker网络里,而且Spring Boot配置里如果用了localhost,容器内部的localhost指的是自己,根本找不到MySQL容器。
正确操作流程
1. 先创建专属的Docker网络(关键!)
Docker默认的bridge网络在容器间的DNS解析有局限,咱们先建一个专属网络让两个容器能互相识别:
docker network create spring-mysql-network
2. 启动MySQL容器并加入这个网络
把你原来的MySQL启动命令改一下,加入刚创建的网络,这样Spring Boot容器就能直接用容器名aname-mysql访问它:
docker run -d \ --name aname-mysql \ --network spring-mysql-network \ -e MYSQL_ROOT_PASSWORD=root \ -e MYSQL_DATABASE=db \ -e MYSQL_USER=root \ -e MYSQL_PASSWORD=root \ mysql:5.7
3. 构建Spring Boot镜像(和你原来的步骤一致)
./gradlew build docker -x test
4. 启动Spring Boot容器并加入同一网络
启动时一定要指定同一个网络,同时记得先修改Spring Boot的数据库配置:
docker run -d \ --name spring-boot-app \ --network spring-mysql-network \ -p 8080:8080 \ # 替换成你实际的Spring Boot镜像名和标签 your-spring-boot-image:latest
必须修改的Spring Boot数据库配置
打开你的application.properties或者application.yml,把数据库连接URL改成用MySQL容器名:
# application.properties spring.datasource.url=jdbc:mysql://aname-mysql:3306/db?useSSL=false&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=root
如果用YAML格式:
# application.yml spring: datasource: url: jdbc:mysql://aname-mysql:3306/db?useSSL=false&serverTimezone=UTC username: root password: root
这里的aname-mysql就是你给MySQL容器起的名字,Docker会在同一个网络里自动把这个名字解析成MySQL容器的IP。
万一还是不行?试试这些排查步骤
- 先进入Spring Boot容器,ping一下MySQL容器名:
docker exec -it spring-boot-app ping aname-mysql,如果能ping通,说明网络没问题,问题出在数据库配置或者MySQL本身 - 看看MySQL容器有没有正常启动:
docker logs aname-mysql,检查初始化日志有没有报错 - 确认MySQL容器的3306端口在监听:
docker exec -it aname-mysql netstat -tulpn | grep 3306
内容的提问来源于stack exchange,提问作者IMOsiris
相关产品推荐
相关产品推荐

