Docker环境下Node.js后端无法连接MySQL数据库问题求助
解决Node.js API容器无法连接Docker MySQL容器的问题
看起来你遇到了Docker容器间网络通信的典型问题,结合你的配置,我整理出几个核心错误点,咱们逐个修正就能解决连接问题。
1. 容器间通信的Host配置错误
在Docker Compose的默认网络中,每个服务都是独立的网络节点,localhost或127.0.0.1在api容器里指的是它自己,不是宿主机也不是db容器。你需要用Docker Compose中定义的服务名db作为host——这是Docker自动维护的内部DNS名称,容器之间可以通过服务名直接通信。
2. 数据库名称不匹配
你的docker-compose.yml里指定创建的数据库是guess-game,但db.js里写的是any-game,这会导致连接时找不到对应的数据库实例。
3. 端口配置错误
MySQL容器内部的默认端口是3306,宿主机映射的6033是给外部(比如宿主机上的客户端)使用的,容器间通信直接用内部端口3306即可,不需要用宿主机的映射端口。
修正后的db.js代码
const mysql = require("mysql"); const db = mysql.createConnection({ host: "db", // 改用Docker Compose中的服务名 user: "db_user", password: "db_user_pass", database: "guess-game", // 匹配docker-compose里的数据库名称 port: 3306, // MySQL容器内部的默认端口 }); db.connect((err) => { if (err) { // 建议打印具体错误信息,方便后续排查 console.error("数据库连接失败详情:", err); throw new Error("数据库连接失败!"); } console.log("数据库连接成功!"); }); module.exports = db;
额外注意事项
- 虽然你用了
depends_on,但它只保证db容器先启动,不保证MySQL服务完全就绪。如果还是偶尔出现连接失败,可以在api的启动脚本里加一个等待MySQL就绪的逻辑,比如用wait-for-it工具,或者自己写个简单的轮询脚本。 - 确保
db_user有从非localhost地址连接的权限:Docker内部网络的地址不属于localhost,MySQL默认新用户可能只允许localhost连接。如果遇到权限问题,可以登录phpmyadmin执行以下SQL:GRANT ALL ON `guess-game`.* TO 'db_user'@'%'; FLUSH PRIVILEGES;
内容的提问来源于stack exchange,提问作者Randall




