You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 10:15:36