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允许远程连接:
- 修改MySQL配置文件(
my.cnf/my.ini),将bind-address设为0.0.0.0(允许所有IP访问) - 执行SQL授权用户远程访问:
- 修改MySQL配置文件(
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
相关产品推荐
相关产品推荐

