You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Docker环境下Node.js后端无法连接MySQL数据库问题求助

解决Node.js API容器无法连接Docker MySQL容器的问题

看起来你遇到了Docker容器间网络通信的典型问题,结合你的配置,我整理出几个核心错误点,咱们逐个修正就能解决连接问题。

1. 容器间通信的Host配置错误

在Docker Compose的默认网络中,每个服务都是独立的网络节点,localhost127.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

火山引擎 最新活动