Docker网络中Spring Boot应用无法连接MySQL数据库问题
问题分析与解决方案
差异原因
- 本地IDE运行时,Spring Boot处于宿主机网络环境,
localhost指向宿主机本身,而你已将MySQL容器的3306端口映射到宿主机,因此能正常连接。 - 应用部署到Docker容器后,容器拥有独立网络命名空间:
- 若仍用
localhost,它指向的是应用容器自身而非宿主机,会触发连接拒绝错误。 - 换成数据库容器名后报
UnknownHostException,核心原因是应用容器未正确加入与数据库容器相同的自定义网络,不同网络下的容器无法通过容器名完成DNS解析。
- 若仍用
端口配置说明
数据库容器的-p 3306:3306映射配置本身无问题,但容器间通信无需依赖宿主机端口映射——同一Docker网络内的容器可直接通过容器内部端口(此处为3306)互通。
解决步骤
1. 修正应用容器启动命令
你的docker run命令参数顺序错误:Docker的配置参数(--name、--network)必须放在镜像名前,镜像名后的内容是传给容器内部执行的命令,而非Docker配置项。错误顺序导致--network shape-shop-network未生效,应用容器未加入指定网络。
正确命令:
docker run --name shape-shop-server --network shape-shop-network -p 8080:8080 shapeshop:1.0
2. 确认数据库URL配置
将application.properties中的数据库地址改为数据库容器名(同一自定义网络内,Docker会自动完成DNS解析):
spring.datasource.url=jdbc:mysql://shape-shop-db-container:3306/shapeshop?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC&useLegacyDatetimeCode=false
3. 等待MySQL容器初始化完成
MySQL容器启动后需要一定时间完成初始化,直接启动应用容器可能因数据库未就绪导致连接失败。可选择:
- 手动等待30秒左右再启动应用容器
- 若使用Docker Compose,可通过
depends_on配合健康检查实现自动等待
4. 验证网络配置一致性
执行以下命令确认两个容器处于同一网络:
docker inspect shape-shop-db-container | grep Networks docker inspect shape-shop-server | grep Networks
输出结果中需同时出现shape-shop-network
内容的提问来源于stack exchange,提问作者Oliver Watkins
相关产品推荐
相关产品推荐

