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

Ubuntu容器中Node.js应用连接MySQL容器出现ECONNREFUSED问题

解决Docker容器间MySQL连接拒绝问题

1. 修正容器间访问的主机名

Docker Compose默认会为所有服务创建共享网络,服务名(而非容器名)是可直接解析的内部域名。你的Ubuntu容器启动命令里应该用服务名mysql作为hostname,而非mysql_container:

CMD ./my-tool --input ./data-to-dump -database database --user root --password root --hostname mysql

2. 处理MySQL服务未就绪的问题

depends_on仅保证容器启动顺序,不代表MySQL服务已经完全启动并接受连接。需要在Ubuntu容器启动流程中添加等待逻辑:

  • 在Dockerfile中安装wait-for-it工具:
RUN apt-get update && apt-get install -y wait-for-it && apt-get clean
  • 修改CMD命令,先等待MySQL端口就绪再执行脚本:
CMD wait-for-it mysql:3306 -- ./my-tool --input ./data-to-dump -database database --user root --password root --hostname mysql

3. 确保MySQL绑定正确地址

默认MySQL可能仅绑定127.0.0.1,导致容器外无法访问。修改MySQL服务的启动命令,添加--bind-address=0.0.0.0:

services:
  mysql:
    command: mysqld --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --bind-address=0.0.0.0

或在my.cnf中配置:

[mysqld]
bind-address = 0.0.0.0

4. 授权MySQL用户远程访问权限

root用户默认仅允许localhost访问,需要授权其从任意主机连接:
在.data/mysql-data/sql/init.sql中添加以下SQL(文件不存在则创建):

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root';
FLUSH PRIVILEGES;

MySQL容器启动时会自动执行该目录下的初始化脚本。

5. 验证连接参数

检查Node.js代码中端口是否明确设置为3306,避免默认值错误:

let connection = await mysql.createConnection({
  host: this.hostname,
  port: 3306,
  user: this.user,
  password: this.password,
});

内容的提问来源于stack exchange,提问作者Juliana Aragão

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 14:17:44