Docker化Spring Boot应用遇连接拒绝错误,求解决方案
问题:Docker化Spring Boot应用无法连接MySQL容器
项目地址:https://github.com/haseeb1988/spRegistration.git
已执行的Docker操作:
- 创建网络:
docker network create -d bridge sp-sql-net - 构建Spring Boot镜像:
docker build -t springboot_website . - 运行应用容器:
docker run --network sp-sql-net --name springboot_mysql_container_rest -p 8080:8080 springboot_website
问题详情:本地直接运行Spring Boot应用时,能正常连接Docker中的MySQL容器;但把Spring Boot应用打包成Docker容器后,连接同一个MySQL容器就启动失败。试过单独Docker命令和Docker Compose两种方式,都没解决。
排查与解决方案
1. 确认MySQL容器在同一网络
Spring Boot容器和MySQL容器必须在同一个Docker网络里才能互相访问,先检查你的MySQL容器是否加入了sp-sql-net:
- 查看MySQL容器的网络信息:
docker inspect <mysql容器名或ID> | grep Networks - 如果不在目标网络,执行命令加入:
docker network connect sp-sql-net <mysql容器名或ID>
2. 修改数据库连接地址
本地运行时用的localhost:3306在Docker容器里指向容器自身,而非宿主机的MySQL容器。必须替换为MySQL容器的容器名或容器IP:
- 用容器名做地址:比如MySQL容器名叫
mysql-db,连接URL改成jdbc:mysql://mysql-db:3306/你的数据库名?useSSL=false&serverTimezone=UTC - 用容器IP做地址:先查MySQL容器IP
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <mysql容器名>,再替换到URL中
3. 检查MySQL容器的启动配置
确保MySQL容器没有限制仅本地访问,启动时不要加--bind-address=127.0.0.1参数,正确的启动命令示例:docker run --name mysql-db --network sp-sql-net -e MYSQL_ROOT_PASSWORD=你的密码 -e MYSQL_DATABASE=你的数据库名 -d mysql:latest
4. 处理MySQL初始化延迟
Spring Boot启动速度可能快于MySQL的初始化进程,导致连接失败:
- 用Docker Compose的话,给MySQL加健康检查,让Spring Boot等MySQL就绪后再启动:
services: mysql: image: mysql:latest networks: - sp-sql-net environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: sp_registration healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 5s timeout: 5s retries: 5 springboot-app: build: . networks: - sp-sql-net ports: - "8080:8080" depends_on: mysql: condition: service_healthy
- 用单独Docker命令的话,手动等待MySQL启动完成(比如等30秒)再启动Spring Boot容器,或者在Spring Boot配置里增加连接重试(比如配置
spring.datasource.hikari.connection-timeout和spring.datasource.hikari.max-retries)
5. 验证容器间网络连通性
进入Spring Boot容器,测试和MySQL容器的连通性:
- 进入容器:
docker exec -it springboot_mysql_container_rest /bin/bash - ping MySQL容器名:
ping <mysql容器名> - 如果ping不通,说明网络配置存在问题,重新检查容器的网络关联
内容的提问来源于stack exchange,提问作者mohammad haseeb
相关产品推荐
相关产品推荐

