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

Docker化Spring Boot应用连接本地MySQL数据库失败问题

Spring Boot Docker容器无法连接MySQL数据库的解决方案

问题根源

Docker容器拥有独立的网络命名空间,容器内的localhost指向容器自身,而非宿主机的localhost。直接运行Jar包时,程序在宿主机环境,localhost能访问本地MySQL;但容器内访问localhost只会查找容器内部的服务,自然连不上宿主机的MySQL,导致Communications link failure错误。

解决办法

1. 替换localhost为宿主机实际IP

  • 找到宿主机的局域网IP(执行ipconfig或ifconfig查看),修改application.properties中的数据库URL:
spring.datasource.url = jdbc:mysql://192.168.x.x/<db>?useSSL=false&serverTimezone=UTC
  • 确保MySQL允许远程连接:
    1. 修改MySQL配置文件(my.cnf/my.ini),将bind-address设为0.0.0.0(允许所有IP访问)
    2. 执行SQL授权用户远程访问:
GRANT ALL PRIVILEGES ON <db>.* TO '<your_username>'@'%' IDENTIFIED BY '<your_password>';
FLUSH PRIVILEGES;

2. 使用Docker host网络模式启动容器

启动容器时添加--network host参数,让容器共享宿主机网络栈,此时容器内的localhost等同于宿主机的localhost:

docker run --network host <projectname>

⚠️ 注意:该方式会取消容器的网络隔离,需根据场景评估是否适用。

3. 用Docker Compose编排服务(推荐)

通过Docker Compose将Spring Boot应用和MySQL纳入同一自定义网络,服务间可通过服务名直接访问,无需依赖宿主机IP:
创建docker-compose.yml文件:

version: '3.8'
services:
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: your_db_password
      MYSQL_DATABASE: <db>
    networks:
      - app-net

  spring-boot-app:
    build: .
    depends_on:
      - mysql
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/<db>?useSSL=false&serverTimezone=UTC
      SPRING_DATASOURCE_USERNAME: root
      SPRING_DATASOURCE_PASSWORD: your_db_password
    networks:
      - app-net

networks:
  app-net:
    driver: bridge

执行以下命令启动服务:

docker-compose up --build

内容的提问来源于stack exchange,提问作者America

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 22:32:42