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

Spring Boot项目连接Docker容器报Socket连接失败问题排查

排查Docker Compose下MariaDB与Java项目连接失败问题

针对你遇到的Socket fail to connect to host:address=(host=studentdb)(port=3306)(type=primary). studentdb错误,从配置和运行逻辑出发,逐一排查以下点:

1. 网络访问逻辑不匹配

你的Java项目运行位置决定了数据库地址的写法:

  • 如果Java项目在宿主机上运行:Docker Compose的studentdb容器名仅在Docker内部网络生效,宿主机无法直接解析。需将application.properties中的数据库地址改为:
    spring.datasource.url=jdbc:mariadb://localhost:3306/student
    
  • 如果Java项目也是Docker Compose中的一个服务:确保你的Java服务和mariadb服务在同一个网络(当前配置已使用默认default网络,无需额外配置),此时用studentdb作为主机名是正确的,但需在Java服务配置中添加depends_on: [mariadb],确保数据库先启动。

2. 数据库容器未正常启动

执行以下命令检查容器状态:

# 查看容器运行状态
docker-compose ps
# 查看数据库启动日志
docker logs studentdb

重点看日志中是否有ready for connections的提示,如果有启动报错(比如数据卷权限不足、环境变量缺失),需先解决容器启动问题。

3. 环境变量未正确加载

你的docker-compose.yml使用了${DB_ROOT_PASSWORD}等环境变量,需确保这些变量已正确配置:

  • 在项目根目录创建.env文件,填入变量值:
    DB_ROOT_PASSWORD=你的root密码
    DB_NAME=student
    DB_APPLICATION_USER=你的应用用户名
    DB_APPLICATION_PASSWORD=你的应用密码
    
  • 启动容器时指定env文件:
    docker-compose --env-file .env up -d
    

如果环境变量未加载,数据库可能未创建指定的student库或应用用户,导致连接失败。

4. MariaDB绑定地址限制

默认情况下,MariaDB可能仅绑定127.0.0.1,拒绝外部连接。需修改配置让其监听所有地址:

  • 如果你有自定义Dockerfile构建MariaDB,在Dockerfile中添加:
    # 复制自定义配置文件,设置bind-address
    COPY my.cnf /etc/mysql/my.cnf
    
    my.cnf内容:
    [mysqld]
    bind-address=0.0.0.0
    
  • 或者直接在docker-compose.yml的mariadb服务中添加命令参数:
    services:
      mariadb:
        # ... 其他配置
        command: --bind-address=0.0.0.0
    

内容的提问来源于stack exchange,提问作者team-btg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 22:30:11