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.cnfmy.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
相关产品推荐
相关产品推荐

