冒个泡401 2025-11-20 19:22 采纳率: 84.6%
浏览 5
已结题

windows docker jar包连不上数据库

我在windows上去运行后端项目的jar包,下面是我运行容器的命令
docker run -d -p 8080:8080 -e SPRING_PROFILES_ACTIVE=prod -e SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3307/ry-flowable-plus -e SPRING_DATASOURCE_USERNAME=root -e SPRING_DATASOURCE_PASSWORD=123456 -e SPRING_REDIS_HOST=my-redis -v ./logs:/ruoyi/server/logs --name ruoyi-backend ruoyi-flowable-plus-backend

下面是容器报错的日志信息

Caused by: java.net.ConnectException: Connection refused (Connection refused)

    at java.net.PlainSocketImpl.socketConnect(Native Method)

    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)

    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)

    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)

    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)

    at java.net.Socket.connect(Socket.java:589)

    at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153)

    at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63)

    ... 106 common frames omitted

一直报错连不上数据库,但是我的后端项目在本地运行时是可以连接到数据库的,搞了两个小时了还没有解决,求问解决办法

img


img

  • 写回答

3条回答 默认 最新

  • 宝码香车 优质创作者: JavaScript技术领域 2025-11-20 19:47
    关注

    让【宝码香车】来帮您解答,本回答参考DeepSeek编写,并整理提供。

    如果答案能帮助您,请采纳,非常感谢!
    .
    每日一句正能量,让它带给您好心情:生活中的困难,就像一场雨,总会停的,雨后的天空会更蓝。
    .

    根据你提供的信息,问题出现在Docker容器中的Java应用无法连接到MySQL数据库。从错误日志看是连接被拒绝,这通常是网络连接问题。

    问题分析

    1. 容器间网络通信问题:你的应用在容器内尝试连接MySQL,但使用的是容器名称mysql,这需要容器在同一个Docker网络中
    2. 端口映射问题:MySQL容器映射到主机的3307端口,但容器内部MySQL仍然使用3306端口

    解决方案

    方案1:使用Docker网络(推荐)

    1. 创建自定义网络
    docker network create my-app-network
    
    1. 将容器连接到同一网络
    # 停止并删除现有容器
    docker stop ruoyi-backend mysql myredis
    docker rm ruoyi-backend mysql myredis
    
    
    # 重新运行容器并加入网络
    docker run -d --name mysql --network my-app-network -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0
    docker run -d --name my-redis --network my-app-network -p 6379:6379 redis
    docker run -d -p 8080:8080 --network my-app-network -e SPRING_PROFILES_ACTIVE=prod -e SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/ry-flowable-plus -e SPRING_DATASOURCE_USERNAME=root -e SPRING_DATASOURCE_PASSWORD=123456 -e SPRING_REDIS_HOST=my-redis -v ./logs:/ruoyi/server/logs --name ruoyi-backend ruoyi-flowable-plus-backend
    

    关键变化

    • 使用--network my-app-network让所有容器在同一个网络
    • 数据库URL改为jdbc:mysql://mysql:3306/ry-flowable-plus(容器内使用3306端口)

    方案2:使用主机网络

    修改启动命令,使用主机网络模式:

    docker run -d -p 8080:8080 --network host -e SPRING_PROFILES_ACTIVE=prod -e SPRING_DATASOURCE_URL=jdbc:mysql://localhost:3307/ry-flowable-plus -e SPRING_DATASOURCE_USERNAME=root -e SPRING_DATASOURCE_PASSWORD=123456 -e SPRING_REDIS_HOST=localhost -v ./logs:/ruoyi/server/logs --name ruoyi-backend ruoyi-flowable-plus-backend
    

    方案3:检查MySQL容器配置

    确保MySQL容器已正确配置并运行:

    # 检查MySQL容器状态
    docker ps | grep mysql
    
    
    # 查看MySQL容器日志
    docker logs mysql
    
    
    # 进入MySQL容器测试连接
    docker exec -it mysql mysql -u root -p123456
    

    验证步骤

    1. 测试容器间网络连通性
    docker exec ruoyi-backend ping mysql
    
    1. 检查应用配置
      确保应用配置文件中的数据库连接信息正确:
    spring:
      datasource:
        url: jdbc:mysql://mysql:3306/ry-flowable-plus?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
        username: root
        password: 123456
    

    推荐做法

    我建议使用方案1,这是Docker容器间通信的标准做法。创建自定义网络可以让容器通过名称相互发现,更符合Docker的最佳实践。

    如果问题仍然存在,请检查:

    • MySQL容器是否正常启动并接受连接
    • 数据库ry-flowable-plus是否已创建
    • 用户权限是否正确

    尝试方案1后应该能解决连接问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 12月3日
  • 已采纳回答 11月25日
  • 创建了问题 11月20日